使用AbcPdf将HTML转换为PDF时的分页符

时间:2012-07-02 10:00:41

标签: html pdf abcpdf

我正在尝试使用abcPdf创建PDF格式的报告。一切正常,但我想在每页的底部添加页码和页边距,并避免在图片中看到的连续中间切割:

page break

var theDoc = new Doc { TopDown = true };
var pageRef = theDoc.AddImageUrl(pdfUrl, true, 1903, true);
while (theDoc.Chainable(pageRef))
{
    theDoc.Page = theDoc.AddPage();
    //I guessI have to do something here???
    pageRef = theDoc.AddImageToChain(pageRef);
}

有人知道是否有可能吗?

4 个答案:

答案 0 :(得分:27)

它确实有效,但我认为AbcPdf正在使用IE的HTML呈现,所以你能做的最好的事情是手动设置渲染引擎为gecko(不要忘记你需要和额外的DLL)或者更新你的IE网络服务器。

theDoc.HtmlOptions.Engine = EngineType.Gecko; 

然后添加分页符只需使用

<div style="page-break-before:always">&nbsp;</div> 

感谢费希拉的评论。

答案 1 :(得分:10)

ABCpdf包括两个HTML呈现引擎。

MSHTML基于Trident,产生的输出大致类似于系统上安装的IE版本。

Gecko以Firefox为基础,截至2013年6月将产生与Firefox 21中大致类似的输出。

您可以使用Doc.HtmlOptions.Engine属性在两个引擎之间切换。

两个引擎都支持分页CSS样式。您可以使用以下内容:

<div style="page-break-before:always">some text</div>
<div style="page-break-after:always">some text</div> 
<div style="page-break-inside:avoid">some text</div> 

请注意,page-break-inside是对基本MSHTML行为的补充。

两个引擎对这些结构的处理略有不同。一般来说,MSHTML更加宽容和直观。如何应用样式的元素必须是可见的才能工作。

因此,如果样式不会在您期望的位置产生中断,最简单的调试方法是将边框样式应用于元素,以便您可以看到中断的位置。这通常会使问题的原因显而易见。

Gecko引擎中的分页符样式并不总是像在MSHTML中一样直观地应用。其根源是CSS规范,该规范说断点样式必须适用于“根元素的正常流”中的块级元素。它允许将这些样式应用于其他元素,但不强制要求它。

在Gecko引擎中,结果是页面分隔样式不能在表格中应用于表格行等元素。如果您不确定某些内容是否可行,只需在Firefox 21.0中尝试打印预览作为简单的完整性检查。

答案 2 :(得分:2)

有一种更好的解决方法。您可以在html的容器(即<div />CSS等)上放置<div />属性,而不是将此<table />强制分页。在css中将page-break-inside设置为auto

// in CSS
#ContainerID
{
    page-break-inside: auto;
}

答案 3 :(得分:0)

是的我已经处理过这个问题,我们通过在表格中添加一行并通过检查html与矩形的高度来确定它是否仍适合页面来解决它。

一旦所有设置都很好用,但速度稍慢