问题
First I would like to point out that stackowerflow helped me with many problems in the past, so thank you all. But now I have come to problem that I haven't fount a solution for yet and it's driving me crazy. I'm not native english speaker, so sorry for any language mistakes.
So here it is:
I'm generating pdf with itextsharp
library(great library by the way). I'm starting with some kind of pdf form/template, to which i'm adding 'fill-out' data. I'm using PdfReader
to read template pdf and by caling PdfStamper
method GetOverContent(pageNum)
for individual pages I get PdfContentByte
. With that PdfContentByte
I'm adding my text/data (BeginText
and EndText
is used on every page). Most of text I add with method ShowTextAligned
. That all ok, generated pdf contains my text. The problem begins where i have to add 'columned' text. I do that with following code:
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
Columned text is added with this code OK, but the text(on that same page/same PdfContentByte
) added AFTER this with ShowTextAligned
is not visible in Acrobat Reader.
Here is the 'fun' part - that text in same pdf file opened with foxit reader is fine/visible/ok.
So text added with ShowTextAligned
after adding ColumnText
is not visible in acrobat reader but visible in foxit reader just fine. This problem exists inside one page, new page resets this problem (PdfContentByte
for next page is new).
My workaround for that was to add all ColumnText
AFTER all calls of ShowTextAligned
. That worked till today, when customer printed out generated pdf with acrobat reader, which after printing the document, displayed message that pdf contains error and that author of pdf should be contacted. Version of Adobe Reader is 10.1.1. Problem is not in customer computer, same thing hapens on my computer.
After researching the web I installed Adobe Acrodat Pro Trial which contains tool Preflight, which is purposed for analyzing pdfs (as far I understand). This tool outputs warning "Invalid content state stream for operator". And here I'm stucked. I belive the problem exists inside added ColumnText
, because document generated without them causes no problem displaying/printing and Preflight states "No problem found".
It is possible that i'm missing some fact and that the problem is in my code...
Please help me, because i'm runnig out of ideas. I hope this post will help someday someone else with the same problem. I cannot attach sample pdf because it contains sensitive data, but if there is no other way, i'll recreate the scenario/code.
回答1:
So to answer my question/problem:
When writing to pdf using PdfContentByte and using method ShowTextAligned
you have to call BeginText
before writing and after you are finished you have to call EndText
. So i did. BUT if you want to add some other element(like ColumnText, Image and probably anything else) you can't do that before you call EndText
. If you do, generated pdf will be 'problematical'/corrupted.
So in pseudocode following is wrong:
BeginText();
ShowtextAligned();
AddImage();
ShowtextAligned();
EndText();
Correct usage is:
BeginText();
ShowtextAligned();
EndText();
AddImage();
BeginText();
ShowtextAligned();
EndText();
I hope this will help someone someday somewhere.
来源:https://stackoverflow.com/questions/8235339/pdf-generated-with-itext-becomes-corrupted-when-using-setsimplecolumn