使用abcPDF将HTML转换为PDF时的额外空白页面

时间:2010-03-04 13:23:05

标签: asp.net abcpdf

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

9 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。空白页面是由CSS中的 page-break-after:always; 引起的。不仅仅是ABCpdf,而且打印后会吐出额外的页面。所以我使用以下代码来消除最后一页: MyDoc.Delete(MyDoc.Page);

然而,这会导致不同类型的问题。在具有IE 8的开发服务器上,我得到了一个额外的空白页面,在我生产IE6的生产中,我没有额外的空白页面。所以我已经通过webupergoo向支持团队发送电子邮件,向我展示了寻找空白页面的方法。我们的想法是遍历pdf并识别所有空白页面并使用上述逻辑删除它们。

我是第二个Jakkwylde的观点。 Websupergoo人员非常有帮助,并迅速作出回应。我有另一个问题让ABCpdf在64位下工作,并花了将近一天的时间试图找出它。他们为我提供了多种可以尝试的方案。他们的支持是正确的,我在几分钟内完成了我的应用程序。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

如果您使用AddImageUrl方法,则值得重新审视的一点是HTML标记的有效性。渲染的PDF不符合预期的实例可能由错误的标记,破坏的标记等引起。

对于它的价值,WebSuperGoo具有出色的支持,并在遇到异常时做出很好的响应。通常,如果您向他们发送源代码,他们可以为您的实施提供建议或提供替代方案。

答案 4 :(得分:0)

Kush是正确的,因为“我遇到了同样的问题。空页面是由于页面中断后:总是;在CSS中。不仅仅是ABCpdf,而且打印后会吐出一个额外的页面。 “

如果div有“page-break-after:always”IE将完全始终启动新页面,如果没有添加任何内容,它将只打印空白。 Firefox没有。

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

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

答案 5 :(得分: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();

它总会给出准确的结果。

答案 6 :(得分:0)

为了避免在最后一页中出现分页,我做了类似的事情并且有效。

我确保最后一页没有页面拆分:总是,这可以使用任何模板或前端框架(如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;
}

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

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

我通过向具有 height: auto 的 div 添加 min-hight: 1in 样式解决了这个问题。