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.
精彩评论