Как заполнить форму XFA с помощью iText?

Код:

using (FileStream pdf = new FileStream("C:/test.pdf", FileMode.Open))
using (FileStream xml = new FileStream("C:/test.xml", FileMode.Open))
using (FileStream filledPdf = new FileStream("C:/test_f.pdf", FileMode.Create))
{
   PdfReader.unethicalreading = true;
   PdfReader pdfReader = new PdfReader(pdf);
   PdfStamper stamper = new PdfStamper(pdfReader, filledPdf);

   stamper.AcroFields.Xfa.FillXfaForm(xml);
   stamper.Close();
   pdfReader.Close();
}

Этот код не вызывает исключений, и вроде бы все в порядке, но если я открою заполненный PDF-файл, Adobe Reader скажет что-то вроде этого:

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

Некоторые поля заполнены правильно, но я не могу это редактировать. Некоторые поля пусты. Если я выберу xml вручную, щелкнув «Импортировать данные» из Adobe Reader, форма будет заполнена правильно, поэтому я думаю, что в xml нет ошибки.


person paldir    schedule 29.10.2014    source источник


Ответы (1)


Вы неправильно создаете объект PdfStamper. Использовать:

PdfStamper stamper = new PdfStamper(pdfReader, filledPdf, '\0', true)

В вашем коде вы не используете PdfStamper в режиме добавления. Это означает, что iText реорганизует различные объекты в вашем PDF-файле. Обычно это не проблема.

Однако ваш PDF-файл поддерживает Reader, что означает, что ваш PDF-файл подписан цифровой подписью с использованием закрытого ключа, принадлежащего Adobe. Эта подпись нарушается при реорганизации объектов внутри PDF-файла. Об этом свидетельствует уже упомянутое вами сообщение:

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

Вы изменили документ недопустимым образом (см. Раздел 8.7 моей книги, озаглавленной «Сохранение прав на использование» форм для чтения ").

Чтобы не нарушить подпись, вам нужно использовать PdfStamper в режиме добавления. Вместо реорганизации исходного содержимого iText теперь сохранит исходный файл нетронутым и добавит новое содержимое после конца исходного файла.

person Bruno Lowagie    schedule 29.10.2014