我正在使用ITextSharp將HTML文檔轉換爲PDF。我使用HTMLWorker.ParseToList並依次循環遍歷每個項目。這工作正常,但是第一頁需要爲後續頁面設置不同的邊距。我可以通過調用MyDocument.NewPage()並調用MyDocument.SetMargins()來完成此操作。
嘗試檢測頁面轉換時發生了我的問題。
我可以使用一個循環來跟蹤頁面轉換,然後調用NewPage()並重置頁邊距,但是,只有當我實際添加了一個包裝到新頁面的段落時,纔會發生這種情況,從而留下整個頁面這幾乎是空白的。
我需要一種先發制人的方式來檢測頁面是否會改變,如果我添加某個段落對象。 我試過使用ColumnText.Go(真)來模擬它(如果結果是ColumnText.NO_MORE_COLUMN,那麼使它成爲分頁符),不幸的是,似乎是最好的flakey,並傾向於檢測分頁符在完全錯誤的地方。
這裏是我當前的代碼:Itextsharp - 檢查添加元素是否會創建新頁面
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);
}
它確實看起來就像他們直接將Java移植到C#並忽略了C#事件模型一樣。我必須創建一個帶有單個函數的獨立迷你類(覆蓋OnStartPage),它繼承了PdfPageEventHelper,並將.SetMargins和.NewPage()調用放在那裏。現在工作正常,甚至不需要模擬,但只是給對象本身的事件出了什麼問題? – GeeItSomeLaldy
@Canazza我不是iText-committer,所以我真的不知道。也許你可以在[iText郵件列表](https://lists.sourceforge.net/lists/listinfo/itext-questions)上提問。請注意,您必須訂閱該列表才能在該列表中發帖。 –