2016-08-19 89 views
1

我使用iTextSharp 5.5.7版生成PDF文檔,使用它們的「流式傳輸」模式 - 我的意思是我沒有指定每一段文本的位置,我只是將段落添加到文檔中,讓iTextSharp找出在哪裏繪製它們。我輸出的文本是報告生成器的結果,因此每次都是不同的。iText(Sharp) - 如何避免創建空白頁?

我遇到的問題是這樣的:想象一下,給定頁面大小和選定的字體,我可以在頁面上放置40行文本。我輸出40個段落,然後我輸出一個空白段落(內容=「」),然後是填充整個頁面的圖像。 iTextSharp完全按照我的說法進行 - 我最終獲得了一頁充滿文本,空白頁面,然後是包含我的圖像的頁面。

但現在我的文檔看起來很有趣 - 在這一切中間有一個意外的空白頁面。

我不能說「不輸出任何空白行」,因爲當然只有20行文字後纔會顯示空白行,在這種情況下,它必須在那裏。我需要一些方法來告訴iTextSharp「只有當它不是頁面上唯一的東西時才包含這個段落」,否則以某種方式檢測到頁面在OnEndPage()中是空白的,並禁止它的輸出(而不會破壞我的頁碼)。

有關我如何做到這一點的任何建議?

添加了來自報告生成LATER

輸出:

<html> 
<p>Information header</p> 
<p>Detail</p> 
<p>Detail</p> 
<p>Detail</p> 
<p></p> <!-- Blank line inserted by report generator for clarity --> 
<p>Information header</p> 
<p>Detail</p> 
<p>Detail</p> 
<p>Detail</p> 
... 
<p>Detail</p> <!-- just by random happenstance this is the last line that will fit on the first page --> 
<p></p> <!-- This line happens to be blank, I have no control over it --> 
<img src="blah blah"></image> 

我的(僞)代碼:

foreach (HtmlNode node in htmlFromReportGenerator) 
{ 
    if (node is text) 
     pdfDoc.Add(new Paragraph(node.text)); 
    else if (node is image) 
     pdfDoc.Add(new Image(node.image)); 
} 
+0

你爲什麼要用插入空白頁的骯髒技巧?骯髒的技巧有骯髒的副作用。請參閱http://stackoverflow.com/a/11185274/1622493以瞭解如何添加空白頁。你不應該期望Stack Overflow上的人得到另一個答案,因爲你沒有提供任何允許我們重現你的問題的代碼。 –

+0

我已經重讀了你的問題(它的表達方式非常混亂),也許你不想在40段和圖像之間添加一個空白頁。也許你正在使用添加空白段落的骯髒技巧,因爲你想在文本和圖像之間引入一些空格。在任何情況下,有這麼多文本和沒有示例代碼的問題,不是一個好的堆棧溢出問題。 –

+0

無論如何:iText忽略'document.newPage()'如果頁面是空白的。如果你想引入一個空白頁面,你必須做一些特別的工作。聲明*這個意外空白的頁面在所有內容中*都不清楚。你應該做更多的努力來解釋這個問題。 –

回答

1

繼布魯諾的建議下,我的(僞)代碼現在看起來是這樣的:

Paragraph lastParagraph = null; 
foreach (HtmlNode node in htmlFromReportGenerator) 
{ 
    if (node is text) 
    { 
     Paragraph parg = new Paragraph(node.text); 
     if ((lastParagraph != null) && (text.Trim().Length == 0)) 
     lastParagraph.SpacingAfter += parg.Leading; 
     else 
     { 
     pdfDoc.Add(parg); 
     lastParagraph = parg; 
     } 
    } 
    else if (node is image) 
    { 
     pdfDoc.Add(new Image(node.image)); 
     lastParagraph = null; 
    } 
}