2016-08-19 71 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; 
    } 
}