Itextsharp, похоже, портит PDF-форму после ее заполнения;проблемы с открытием в Adobe Reader для WP7 - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь динамически создать PDF-форму из приложения asp.net C #. Форма создается и отправляется по электронной почте некоторым пользователям. Люди уже несколько месяцев могут открывать его в Adobe Reader.

Недавно поступил запрос о том, чтобы пользователи могли читать эти вложения в формате PDF на своих мобильных телефонах. К сожалению, когда эти люди пытаются открыть PDF-файлы на своих телефонах, появляется сообщение «При открытии документа произошла ошибка».

Я попытался открыть исходную форму на своем телефоне wp7, и она работает.

Я отправил копию одной из неработающих PDF-файлов в бесплатную службу проверки PDF / валидатора. Служба вернулась со следующим сообщением:

Не удалось загрузить файл: неверная ссылка 'startxref'

Это заставляет меня думать, что проблема в том, что Adobe Reader перестраивает некоторые из метаданных / индексов в документе при его открытии. Поскольку большинство людей имеют быстрые машины, время, потраченное на восстановление этих показателей, ничтожно мало. Но, насколько я понимаю, версия телефона не имеет этой возможности, поэтому она читает xstartref и не работает.

Вот код в моем приложении, который, кажется, производит поврежденный файл:

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();

Что я делаю не так? Я читал, где не закрытие потока, должным образом штамп и pdfreader может создать проблемы. Но я думаю, что закрываю это правильно. Что я пропускаю?

1 Ответ

1 голос
/ 30 сентября 2011

Вы должны привязать PdfReader к исходному документу, а PdfStamper - к целевому документу.

//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);

В противном случае вы читаете документ, когда пишете в него, который не 'хорошая идея.

...