开发者

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

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?


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜