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

使用AbcPdf将HTML转换为PDF时的分页符,html,pdf,abcpdf,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

我正在尝试用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);
}


有人知道这是否可行吗?

它确实可行,但我认为AbcPdf使用的是IE的HTML呈现,所以最好的办法是手动将呈现引擎设置为gecko(不要忘记您需要额外的DLL)或在web服务器中更新IE

theDoc.HtmlOptions.Engine = EngineType.Gecko; 
然后,要添加分页符,只需使用

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


感谢feeela的评论。

有更好的方法解决这个问题。您可以在html的容器上放置
CSS
属性,而不是使用此
强制分页。在css中,将
内部分页符设置为
自动

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

ABCpdf包括两个HTML呈现引擎

MSHTML one基于Trident,将产生与系统上安装的IE版本大致相似的输出

Gecko one以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> 
一些文本
一些文本
一些文本
请注意,内部的分页符是对基本MSHTML行为的添加

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

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

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


在Gecko引擎中,结果是分页符样式不能应用于表中的元素,例如表行。如果您不确定某些功能是否可行,只需在Firefox 21.0中尝试打印预览,作为一种简单的合理性检查。

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


它在所有设置中都能很好地工作,但速度稍慢

我不知道AbcPdf,但一些PDF库可以解释CSS定义,如
page break:before在选定的元素上。它确实有效,但我认为AbcPdf正在使用IE的HTML呈现,因此您可以做的最好的事情是手动将呈现引擎设置为gecko(theDoc.HtmlOptions.engine=EngineType.gecko;)或在web服务器中更新IE。然后,要添加分页符,只需使用,如果您有一个连续的表格延伸到多个页面上,那么您如何知道在何处渲染,如何停止在连续表格上拉伸?有人找到了这个问题的真正答案吗?在向HTML添加分页符之前,您需要先计算页面大小,然后计算项目大小,并提出要显示的最大项目数,这是我发现您可以做到的唯一方法。自动是默认值,所以在实践中,这不会有任何效果。我不确定这是否是一个默认设置,但我确信它是有效的。我已经在我的应用程序中使用了它,它完成了任务。解决方案的另一部分是,您可以在任何html元素上应用CSS类,这在前面没有提到过。因此,我不知道你为什么投反对票??有什么不对劲吗,如果有,很乐意改正!!不能否认它的工作,在我的项目,是的,它是自动默认情况下,但它仍然需要放置生效。在css类或id中包装是合理的!