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

Rem*_*sen 13 html pdf abcpdf

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

分页符

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);
}
Run Code Online (Sandbox Code Playgroud)

有人知道是否有可能吗?

Rem*_*sen 27

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

theDoc.HtmlOptions.Engine = EngineType.Gecko; 
Run Code Online (Sandbox Code Playgroud)

然后添加分页符只需使用

<div style="page-break-before:always">&nbsp;</div> 
Run Code Online (Sandbox Code Playgroud)

感谢feeela的评论.

  • 如果你有一个连续的表扩展到几页,那么你怎么知道在哪里渲染<div>? (3认同)

Onc*_*est 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> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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