使用SetSimpleColumn()时,使用itext生成的PDF变为“已损坏”

时间:2011-11-22 23:22:41

标签: c# pdf-generation itextsharp acrobat foxit-reader


首先我想指出,stackowerflow过去曾帮助我解决许多问题,谢谢大家。但是现在我遇到了一个问题,即我还没有为解决方案提供解决方案而且这让我发疯了。我不是母语为英语的人,对任何语言错误都很抱歉。

所以这是:

我正在使用itextsharp库生成pdf(顺便说一下,这是一个很棒的库)。我从某种pdf表单/模板开始,我正在添加“填充”数据。我正在使用PdfReader来阅读模板pdf,并为我获得PdfStamper的各个网页加密GetOverContent(pageNum)方法PdfContentByte。使用PdfContentByte我正在添加我的文本/数据(每个页面都使用BeginTextEndText)。我用方法ShowTextAligned添加的大部分文字。一切都好,生成的pdf包含我的文本。问题开始于我必须添加'columned'文本。我使用以下代码执行此操作:

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

使用此代码添加圆柱形文本确定,但在Acrobat Reader中看不到与PdfContentByte之后添加的文本(在同一页面/同一ShowTextAligned上)。

这是'有趣'部分 - 用foxit阅读器打开的同一个pdf文件中的文字很好/可见/确定。

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

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

在研究网络后,我安装了Adobe Acrodat Pro试用版,其中包含Preflight工具,用于分析pdf(据我所知)。此工具输出警告“操作员的内容状态流无效”。在这里,我被困住了。我相信问题存在于添加的ColumnText内部,因为没有它们生成的文档会导致显示/打印没有问题,预检指出“找不到问题”。

我可能错过了一些事实,问题出现在我的代码中......

请帮助我,因为我的想法已经过时了。 我希望这篇文章能够帮助其他人解决同样的问题。 我无法附加示例pdf,因为它包含敏感数据,但如果没有其他方法,我将重新创建场景/代码。

1 个答案:

答案 0 :(得分:2)

所以回答我的问题/问题: 使用PdfContentByte并使用方法ShowTextAligned写入pdf时,您必须在写作之前致电BeginText,完成后您必须致电EndText。所以我做了。但是如果你想要添加一些其他元素(比如ColumnText,Image和其他任何东西),在调用EndText之前你不能这样做。如果这样做,生成的pdf将“有问题”/已损坏。

所以在伪代码中跟随错误:

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

正确用法是:

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

我希望有一天能在某个地方为某人提供帮助。