使用itext生成的PDF变成';已损坏';当使用SetSimpleColumn()时

本文关键字:SetSimpleColumn 已损坏 PDF 变成 itext 使用 | 更新日期: 2023-09-27 18:15:23


首先,我想指出,stackowerflow在过去帮助我解决了许多问题,所以谢谢大家。但现在我遇到了一个我还没有找到解决方案的问题,这让我抓狂。我不是以英语为母语的人,所以很抱歉有任何语言错误。

现在是:

我正在用itextsharp库(顺便说一句,很棒的库(生成pdf。我从某种pdf表单/模板开始,在其中添加"填写"数据。我使用PdfReader来读取模板pdf,通过对单个页面缩放PdfStamper方法GetOverContent(pageNum),我得到PdfContentByte。有了PdfContentByte,我添加了我的文本/数据(每页都使用BeginTextEndText(。我用方法ShowTextAligned添加的大部分文本。所有好的,生成的pdf包含我的文本。问题开始于我必须添加"列"文本的地方。我用以下代码做到这一点:

ColumnText ct = new ColumnText(cb);//cb is PdfContentByte
Phrase p = new Phrase(txt, FontFactory.GetFont(DEFAULT_FONT, BaseFont.CP1250, true, font_size));
ct.SetSimpleColumn(p, x, y, x+width, y+height, 10, alignment);
ct.Go();
setDefaultFont();//sets font to PdfContentByte again with setFontAndSize and SetColorFill

使用此代码添加列文本可以,但使用ShowTextAligned添加的文本(在同一页/同一PdfContentByte上(在Acrobat Reader中不可见。

这是"有趣"的部分——用foxit阅读器打开的同一个pdf文件中的文本很好/可见/可以。

因此,添加ColumnText后添加ShowTextAligned的文本在acrobat阅读器中不可见,但在foxit阅读器中可见。此问题存在于一个页面内,新页面重置此问题(下一页的PdfContentByte为新页面(。

我的解决方法是在ShowTextAligned的所有调用之后添加所有ColumnText。直到今天,当客户用acrobat阅读器打印出生成的pdf时,该阅读器在打印文档后显示信息,即pdf包含错误,应联系pdf作者。Adobe Reader的版本为10.1.1。问题不在客户的电脑上,同样的事情也发生在我的电脑上。

在研究了网络之后,我安装了Adobe Acrodat Pro试用版,其中包含用于分析PDF的工具Preflight(据我所知(。此工具输出警告"操作员的内容状态流无效"。我被卡住了。我相信添加的ColumnText中存在问题,因为在没有它们的情况下生成的文档不会导致显示/打印问题,并且Preflight状态为"未发现问题"。

可能我遗漏了一些事实,问题出在我的代码中。。。

请帮帮我,因为我没什么主意了。我希望这篇文章有一天能帮助到其他有同样问题的人。我不能附上pdf样本,因为它包含敏感数据,但如果没有其他方法,我会重新创建场景/代码。

使用itext生成的PDF变成';已损坏';当使用SetSimpleColumn()时

因此,要回答我的问题:使用PdfContentByte和方法ShowTextAligned写入pdf时,必须在写入前调用BeginText,完成后必须调用EndText。我照做了。但是,如果你想添加一些其他元素(比如ColumnText、Image,可能还有其他任何元素(,在调用EndText之前,你不能这样做。如果你这样做,生成的pdf将"有问题"/损坏。

所以在伪代码中以下是错误的:

BeginText();
ShowtextAligned();
AddImage();
ShowtextAligned();
EndText();

正确的用法是:

BeginText();
ShowtextAligned();
EndText();
AddImage();
BeginText();
ShowtextAligned();
EndText();

我希望有一天这能帮助到某个人。