【发布时间】:2016-12-26 19:14:54
【问题描述】:
我正在使用 iTextSharp 5.5.7 版生成 PDF 文档,使用他们的“流式传输”模式 - 我的意思是我没有指定每段文本的位置,我只是在文档中添加段落并让 iTextSharp 找出在哪里绘制它们。我输出的文本是报表生成器的结果,所以每次都不一样。
我遇到的问题是:想象一下,给定页面大小和所选字体,我可以在页面上放置 40 行文本。我输出 40 个段落,然后输出一个空白段落 (contents=""),然后是一个填满整个页面的图像。 iTextSharp 完全按照我说的去做 - 我最终得到一页完整的文本、一个空白页,然后是一个包含我的图像的页面。
但现在我的文档看起来很有趣 - 在所有内容的中间都有这个出乎意料的空白页。
我不能只说“不要输出任何空行”,因为当然该空行可能仅在 20 行文本之后出现,在这种情况下它必须存在。我需要一些方法来告诉 iTextSharp“仅当它不是页面上唯一的内容时才包含此段落”,或者以某种方式检测到 OnEndPage() 中的页面为空白并抑制其输出(不会搞砸我的页码)。
关于如何做到这一点的任何建议?
稍后添加
报告生成器的输出:
<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));
}
【问题讨论】:
-
你为什么要使用肮脏的技巧来插入空白页?肮脏的技巧有肮脏的副作用。请参阅stackoverflow.com/a/11185274/1622493 了解如何添加空白页。你不应该期望 Stack Overflow 上的人会给出另一个答案,因为你没有提供任何代码来让我们重现你的问题。
-
我重读了您的问题(措辞非常混乱),也许您不想在 40 段和图像之间添加空白页。也许您正在使用添加空白段落的肮脏技巧,因为您想在文本和图像之间引入一些空间。无论如何,一个有这么多文本但没有示例代码的问题不是一个好的 Stack Overflow 问题。
-
无论如何:如果页面为空白,iText 将忽略
document.newPage()。如果要引入空白页,则必须付出特别的努力。 在所有内容的中间都有这个意外的空白页这句话不清楚。你真的应该多花点功夫来解释这个问题。 -
@BrunoLowagie 希望伪代码能增加一些清晰度。基本上,我收到了一些混合了文本和图像的信息。我正在获取该信息并从中生成 PDF 文档。我没有调用 document.newPage(),我根本没有尝试插入空白页。只是偶然,在这种特殊情况下,空白行恰好落在新页面的开头,然后是一张大图。
-
添加另一个检查空行的
if。抑制它们并确保为下一个Paragraph定义一个setSpacingBefore。
标签: itext