我正在使用ITextSharp将HTML文档转换为PDF。我使用HTMLWorker.ParseToList并逐个遍历每个项目。这很好用,但是第一页需要具有与后续页面不同的边距大小。我可以通过调用MyDocument.NewPage()并调用MyDocument.SetMargins()来实现此目的。
当尝试检测页面转换时,我的问题出现了。
我可以使用循环来跟踪页面转换,然后调用NewPage()并重置边距,但是,只有在我添加一个换行到新页面的段落之后,才能进行此操作,留下整个页面几乎为空白。
如果我添加某个段落对象,我需要一种预先检测页面是否会更改的方法。 我尝试使用ColumnText.Go(true)模拟它(如果结果为ColumnText.NO_MORE_COLUMN,则进行分页),不幸的是,它似乎最多只能检测错误的页面中断位置。
以下是我的当前代码:
这会导致在第二页结束之前无法检测到分页,这是不好的。
我找到的唯一解决办法是将传递到simulation.SetSimpleColumn中的高度减半。
虽然这样可以解决问题,但我不知道为什么。如果有人能给我任何见解,那就太好了。
感谢Alexis的帮助,我已经弄清楚了。ITextSharp非常严格地遵循Java事件模型,这很麻烦,因为我一直在寻找Writer和Document中的事件。首先我必须创建一个类来覆盖PdfPageEventHelper:
接下来,我设置了 Writer 对象的 PageEvent 属性,并修改了循环以移除模拟。
当尝试检测页面转换时,我的问题出现了。
我可以使用循环来跟踪页面转换,然后调用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);
}
这会导致在第二页结束之前无法检测到分页,这是不好的。
我找到的唯一解决办法是将传递到simulation.SetSimpleColumn中的高度减半。
虽然这样可以解决问题,但我不知道为什么。如果有人能给我任何见解,那就太好了。
感谢Alexis的帮助,我已经弄清楚了。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);
}