17

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

有人知道这是否可能吗?

4

4 回答 4

40

它确实有效,但我认为 AbcPdf 正在使用 IE 的 HTML 渲染,因此您可以做的最好的事情是手动将渲染引擎设置为 gecko(不要忘记您需要额外的 DLL)或在您的 Web 服务器中更新 IE。

theDoc.HtmlOptions.Engine = EngineType.Gecko; 

然后添加分页符只需使用

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

感谢feela 的评论。

于 2012-07-03T10:52:24.503 回答
14

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 中的 Print Preview 进行简单的完整性检查。

于 2013-06-20T11:15:34.350 回答
2

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

// in CSS
#ContainerID
{
    page-break-inside: auto;
}
于 2013-05-06T05:52:26.727 回答
0

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

一旦所有设置都可以很好地工作,但速度有点慢

于 2014-04-11T06:01:38.683 回答