【问题标题】:Extra blank page when converting HTML to PDF using abcPDF使用 abcPDF 将 HTML 转换为 PDF 时出现额外的空白页
【发布时间】:2011-01-23 16:26:05
【问题描述】:

我有一个 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 时,我突然在每个真实报告页面之后插入了一个空白页面。我不想回滚我刚刚为消除此问题所做的更改,所以我希望有人知道为什么要插入额外的页面。

【问题讨论】:

    标签: asp.net abcpdf


    【解决方案1】:

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

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

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

    【讨论】:

    • 在不同的环境下使用不同的IE版本有同样的问题。我遵循相同的方法,到目前为止它对我来说效果很好。
    【解决方案2】:
    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);
        }
    }
    

    【讨论】:

    • 如果一页上只有图像,这将不起作用。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        Kush 是正确的,因为“我遇到了同样的问题。空页是由于 CSS 中的 page-break-after: always; 造成的。不仅是 ABCpdf,而且打印出来的页面也会多出一页。 "

        如果一个 div 有“page-break-after:always”,IE 会真正always 开始一个新页面,如果没有添加任何内容,它只会打印空白。 Firefox 没有。

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

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

        【讨论】:

          【解决方案6】:

          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();
          

          它总会给出准确的结果。

          【讨论】:

            【解决方案7】:

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

            我确保最后一页没有 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;
            }
            

            【讨论】:

              【解决方案8】:

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

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

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

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】: