Itextsharp seems to be corrupting a pdf form after filling it out; problems opening in Adobe Reader for WP7

青春壹個敷衍的年華 提交于 2019-12-24 12:15:14

问题


I'm trying to dynamically generate a pdf form from an asp.net C# application. The form is generated and emailed to some users. People have been able to open it on Adobe Reader for months now.

Recently, there has been a request that users be able to read these pdf attachments on their mobile phones. Unfortunately, when these people try to open the pdfs on their phones, it says "There was an error opening the document."

I tried opening the original form on my wp7 phone and it works.

I sent a copy of one of the pdfs that is not working to the a free pdf/a validator service. The service came back with the following message:

Failed to load file: incorrect 'startxref' reference

This makes me think that the issue is that Adobe Reader is rebuilding some of the metadata/indices in the document when it opens. Because most people have fast machines, the time spent rebuilding these indices is negligible. But from what I understand the phone version does not have this capability, so it is reading the xstartref and failing.

Here is the code in my application that appears to be producing the corrupt file:

File.Copy(original, newpath);
FileStream fs = new FileStream(newpath, FileMode.Open);
PdfReader r = new PdfReader(fs);
PdfStamper stamper = new PdfStamper(r, fs);            
AcroFields af = stamper.AcroFields;

af.SetField("Event", ef.eName); af.SetField("EventType", ef.EventType);
af.SetField("eStartDate", ef.eStartDate);
af.SetField("eStartTime",ef.eStartTime);


stamper.FormFlattening = true;
stamper.FreeTextFlattening = true;
stamper.Close();

r.Close();
fs.Close();

What am I doing wrong? I've read where not closing the stream, stamper and pdfreader properly can create trouble. But I think I am closing it properly. What am I overlooking?


回答1:


You should be binding the PdfReader to your source document and your PdfStamper to your destination document.

//Get rid of the below line completely
//File.Copy(original, newpath);
FileStream fs = new FileStream(newpath, FileMode.Open);
PdfReader r = new PdfReader(original);
PdfStamper stamper = new PdfStamper(r, fs);

Otherwise you're reading from a document while you write to it which isn't a good idea.



来源:https://stackoverflow.com/questions/7604072/itextsharp-seems-to-be-corrupting-a-pdf-form-after-filling-it-out-problems-open

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!