我正在使用 ITextSharp 将 HTML 文档转换为 PDF。我使用 HTMLWorker.ParseToList 并依次遍历每个项目。这很好用,但是第一页需要与后续页面具有不同的边距大小。我可以通过调用 MyDocument.NewPage() 和调用 MyDocument.SetMargins() 来做到这一点。
尝试检测页面转换时会出现我的问题。
我可以使用循环来跟踪页面转换,然后调用 NewPage() 并重置边距,但是,只有在我实际添加了一个换行到新页面上的段落时才会发生这种情况,从而使整个页面实际上是白色的-空间。
如果我添加某个段落对象,我需要一种预先检测页面是否会更改的方法。我已经尝试使用 ColumnText.Go(true) 来模拟它(如果结果是 ColumnText.NO_MORE_COLUMN,则将其设为分页符),不幸的是,这似乎充其量是易碎的,并且倾向于检测分页符完全错误的地方。
这是我当前的代码:
ColumnText simulation = new ColumnText(Writer.DirectContent);
simulation.SetSimpleColumn(Writer.PageSize);
bool FirstPage = true;
foreach (var item in ItemList)
{
var para = new Paragraph("", Normal);
para.AddAll(item.Chunks);
para.SpacingAfter = 10;
foreach (Chunk c in item.Chunks)
{
simulation.AddText(c);
}
if(FirstPage) {
int simresult = simulation.Go(true);
if(simresult == (int)ColumnText.NO_MORE_COLUMN)
{
textDocument.SetMargins(100,100,100,100);
textDocument.NewPage();
FirstPage = false;
}
}
textDocument.Add(para);
}
这导致它直到第 2 页结束才检测到分页符。这不好。
我发现让它工作的唯一方法是将进入simulation.SetSimpleColumn的高度减半。
它有效,但我不知道为什么,老实说,这不好。如果有人能给我任何见解,那就太好了。
感谢亚历克西斯,我已经解决了。ITextSharp 非常彻底地遵循 Java 事件模型,这很烦人,因为我直接在 Writer 和 Document 中查找事件。首先,我必须创建一个覆盖 PdfPageEventHelper 的类:
internal class MainTextEventsHandler : PdfPageEventHelper
{
public override void OnStartPage(PdfWriter writer, Document document)
{
document.SetMargins(document.LeftMargin, document.LeftMargin, document.TopMargin, document.BottomMargin); //Mirror the horizontal margins
document.NewPage(); //do this otherwise the margins won't take
}
}
接下来,我设置了 Writer 对象的 PageEvent 属性,并修改了循环以删除模拟。
Writer.PageEvent = new MainTextEventsHandler();
foreach (var item in ItemList)
{
var para = new Paragraph("", Normal);
para.AddAll(item.Chunks);
/* per-paragraph stuff here */
para.SpacingAfter = 10;
textDocument.Add(para);
}