使用itext生成的PDF变成';已损坏';当使用SetSimpleColumn()时
本文关键字:SetSimpleColumn 已损坏 PDF 变成 itext 使用 | 更新日期: 2023-09-27 18:15:23
首先,我想指出,stackowerflow在过去帮助我解决了许多问题,所以谢谢大家。但现在我遇到了一个我还没有找到解决方案的问题,这让我抓狂。我不是以英语为母语的人,所以很抱歉有任何语言错误。
现在是:
我正在用itextsharp
库(顺便说一句,很棒的库(生成pdf。我从某种pdf表单/模板开始,在其中添加"填写"数据。我使用PdfReader
来读取模板pdf,通过对单个页面缩放PdfStamper
方法GetOverContent(pageNum)
,我得到PdfContentByte
。有了PdfContentByte
,我添加了我的文本/数据(每页都使用BeginText
和EndText
(。我用方法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样本,因为它包含敏感数据,但如果没有其他方法,我会重新创建场景/代码。
因此,要回答我的问题:使用PdfContentByte和方法ShowTextAligned
写入pdf时,必须在写入前调用BeginText
,完成后必须调用EndText
。我照做了。但是,如果你想添加一些其他元素(比如ColumnText、Image,可能还有其他任何元素(,在调用EndText
之前,你不能这样做。如果你这样做,生成的pdf将"有问题"/损坏。
所以在伪代码中以下是错误的:
BeginText();
ShowtextAligned();
AddImage();
ShowtextAligned();
EndText();
正确的用法是:
BeginText();
ShowtextAligned();
EndText();
AddImage();
BeginText();
ShowtextAligned();
EndText();
我希望有一天这能帮助到某个人。