10

我有一个 HTML 报告,每个打印页面都包含一个<div class="page">. 页面类定义为

width: 180mm;
height: 250mm;
page-break-after: always;
background-position: centre top;
background-image: url(Images/MainBanner.png);
background-repeat: no-repeat;
padding-top: 30mm;

在对我的报告内容进行了一些更改后,当我调用 abcPDF 将报告转换为 PDF 时,突然我在每个真实报告页面之后都插入了一个空白页面。我不想回滚我刚刚为消除这个问题所做的更改,所以我希望有人知道为什么要插入额外的页面。

4

9 回答 9

8

我遇到了同样的问题。空页是由于page-break-after: always; 在 CSS 中。不仅是 ABCpdf,而且印刷品也会多出一页。所以我用下面的代码来消除最后一页: MyDoc.Delete(MyDoc.Page);

然而,这导致了不同类型的问题。在具有 IE 8 的开发服务器上,我得到一个额外的空白页,而在具有 IE6 的生产服务器上,我没有得到额外的空白页。所以我给 websupergoo 的支持团队发了电子邮件,告诉我一种寻找空白页面的方法。这个想法是遍历pdf并识别所有空白页并使用上述逻辑将其删除。

我同意 Jakkwylde 的意见。Websupergoo 的人非常乐于助人,而且反应迅速。我在让 ABCpdf 在 64 位下工作时遇到了另一个问题,我花了将近一天的时间试图弄清楚。他们为我提供了多种我可以尝试的场景。他们的支持是正确的,我在几分钟内启动并运行了我的应用程序。

于 2010-03-15T23:24:12.290 回答
4
protected void RemoveBlankPages(Doc pdf)
{
    for (int i = pdf.PageCount; i > 0; i--)
    {
        pdf.PageNumber = i;

        //get the pdf content
        string textContent = pdf.GetText("Text");

        //delete the page if it is blank
        if (string.IsNullOrEmpty(textContent))
            pdf.Delete(pdf.Page);
    }
}
于 2012-09-07T18:46:26.480 回答
2

我发现 abcPDF 很奇怪且不可预测。话虽如此,可能发生的情况是页面大小和分页后的组合可能是罪魁祸首。减少页面高度和/或删除分页符。

于 2010-03-04T14:20:10.183 回答
2

如果您使用该AddImageUrl方法,值得重新审视的一件事是您的 HTML 标记的有效性。呈现的 PDF 与预期不符的情况可能是由于标记错误、标签损坏等造成的。

值得一提的是,WebSuperGoo 具有出色的支持,并且在您遇到异常时会做出出色的响应。如果您将源代码发送给他们,他们通常可以建议解决方法或为您的实现提供替代方案。

于 2010-03-11T03:18:31.580 回答
0

库什是正确的,“我遇到了同样的问题。空页是由于分页后:总是;在 CSS 中。不仅是 ABCpdf,而且打印出来的页面也会多出一页。”

如果一个 div 有 "page-break-after:always" IE 将永远开始一个新页面,如果没有添加任何内容,它只会打印空白。火狐没有。

abcpdf 使用 IE8s 渲染引擎,因此会生成一个空白页面。出于 OP 的目的,仅使用显式高度即可解决问题,并且引擎将为您插入分页符。

我正在尝试解决类似的问题,我无法明确设置高度,因为有时内容可能需要 2 页。(每一页对应一个人,每个人在打印时都要从新的一页开始)。我也通过电子邮件发送了 abcpdf 以查看他们是否有黑客修复来检测空页面,但很好奇是否有人知道如何解决潜在问题和 css hack IE8 以使其在空页面时不打印最终页面。我猜这是不可能的,但想确保我没有遗漏一些明显的东西。

于 2010-04-30T19:38:47.620 回答
0

ABCPDF的AddImageURL()方法是松散绑定方法,它不会在所需区域内紧密渲染 html,从而导致新的空白页。

尝试使用AddImageHTML()方法将所需的 HTML 转换为 PDF ..

Doc theDoc = new Doc();
theDoc.Page = theDoc.AddPage();

int theID = 0;
theDoc.SetInfo(0, "CheckBgImages", "1");
theDoc.SetInfo(0, "RenderDelay", "5000");
theDoc.HtmlOptions.Engine = EngineType.MSHtml;
theID = theDoc.AddImageHtml(HTML);

while (true)
{
 if (!theDoc.Chainable(theID))
                break;
            theDoc.Page = theDoc.AddPage();
            theID = theDoc.AddImageToChain(theID);
        }

        for (int i = 0; i <= theDoc.PageCount; i++)
        {
            theDoc.PageNumber = i;
            theDoc.Flatten();
        }

        theDoc.Save(HttpContext.Current.Server.MapPath(Path));
        theDoc.Clear();

它总是会给出准确的结果。

于 2012-07-16T11:09:15.577 回答
0

为了避免在最后一页出现分页,我做了这样的事情并且它奏效了。

我确保最后一页没有 page-break-after: 总是,这可以使用任何模板或前端框架(如 angularJS)来完成,但对于这个示例,我使用刀片模板(但任何 php 都可以。 ..)

@if ($last_page)
   <div class='footer last-page'>
@else
   <div class='footer'>

然后我的样式表中有这个

.footer {
    page-break-after:always;
}

.last-page {
    page-break-after:avoid;
}
于 2015-01-06T15:25:04.220 回答
0

我们只在生产环境中遇到了同样的问题,但在测试环境中没有。我们只在 html 中的多个位置使用了 page-brek-after。

修复第一个问题:我通过一个一个地删除 page-brek-after 属性发现了这个问题,这最终给了我 DIV 部分,其中一些元素导致了分页符。

我修复了 DIV 中每个元素的高度,这最终解决了我的问题,而没有删除 page-break-after 属性。

修复类似问题:如果您有自定义硬编码页脚,请确保通过增加/减少它的高度和边距来检查。

于 2018-12-10T19:21:07.427 回答
0

我在 html 到 pdf 中发生了同样的事情,其中​​ abcpdf在其余内容(如第 1 页)之前添加了一个空白页面,上面只有一个页脚。当我的内容包含一个由 div 包围的表格时,会发生这种情况,其中 div 高度height:auto后跟一个page-break-before: always. 仅当表数据包含"",string.Empty或单行文本时才会发生。如果表格数据包含 2 行或更多文本,则不存在问题。

我通过向min-hight: 1in具有高度的 div 添加样式来解决它:auto。

于 2021-06-22T15:51:35.437 回答