我正在使用 ITextSharp 将 HTML 文档转换为 PDF。我使用 HTMLWorker.ParseToList 并依次循环遍历每个项目。这很好用,但是第一页需要与后续页面具有不同的页边距大小。我可以通过调用 MyDocument.NewPage() 和 MyDocument.SetMargins() 来实现。
我在尝试检测页面转换时出现问题。
我可以使用循环来跟踪页面转换,然后调用 NewPage() 并重置页边距,但是,这只有在我实际添加了一个换行到新页面的段落后才会发生,而整个页面几乎是白色的-空间。
如果我添加某个 Paragraph 对象,我需要一种先发制人的方法来检测页面是否会发生变化。
我试过使用 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);
}
最佳答案
看看Page Events , 特别是 onStartPage和/或 onEndPage以确定是否必须更改文档的边距。
请注意,这些示例适用于 Java 版本,但转换为 iTextSharp 应该很简单。
关于c# - Itextsharp - 检查添加元素是否会创建新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554611/