iText 7 .NET автоматически делает мои поля доступными только для чтения

Я новичок в iText. Я загрузил бесплатную 30-дневную пробную версию и попробовал следующее на .NET MVC: 1. Извлечь поля из формы PDF:

string src = "mypdf.pdf";
string dest = "mypdfRES.pdf";
PdfReader newReader = new PdfReader(src);
newReader.SetUnethicalReading(true);
PdfDocument pdf = new PdfDocument(newReader, new PdfWriter(dest));
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);
IDictionary<String, PdfFormField> fields = form.GetFormFields();

После этого я устанавливаю значение в определенное поле

PdfFormField toSet;
fields.TryGetValue("form1[0].#subform[0].Line1_FamilyName[0]", out toSet); 
toSet.SetValue("Test familyname");
pdf.Close();

Теперь, когда я открываю только что сохраненный PDF-документ mypdfRES.pdf, все поля пусты.

Пожалуйста, подскажите, почему iText автоматически устанавливает все поля моей формы только для чтения.

PS. Ссылка на PDF-документ, использованный в этом тесте, https://www.uscis.gov/system/files_force/files/form/i-765.pdf?download=1


person Fmbishop    schedule 21.05.2017    source источник
comment
Поделитесь файлом PDF, который можно использовать для воспроизведения проблемы.   -  person Alexey Subach    schedule 21.05.2017
comment
@AlexeySubach вот ссылка uscis.gov/ system / files_force / files / form / i-765.pdf? download = 1.   -  person Fmbishop    schedule 21.05.2017
comment
A Ваша форма - это гибридная форма XFA. Этот тип формы может потребовать особого обращения. Б Ваш документ содержит подпись о правах использования. Чтобы не сделать его недействительным, вы должны отредактировать его, используя инкрементное обновление.   -  person mkl    schedule 22.05.2017
comment
Какую именно версию iText вы используете? Я просто проверил ваш код как есть, и фамилия была четко указана, это поле не было пустым. (Adobe Reader пожаловался на недействительную подпись прав использования, но этого следовало ожидать.)   -  person mkl    schedule 22.05.2017
comment
@AlexeySubach Файл также зашифрован. Я попытался отредактировать его в режиме добавления, но new StampingProperties().useAppendMode(), а также new StampingProperties().preserveEncryption().useAppendMode() привели к недопустимым PDF-файлам, которые Adobe Reader даже не открывает. Возможно, вы захотите изучить это.   -  person mkl    schedule 22.05.2017
comment
@mkl спасибо за дополнительную информацию, мы изучаем ее.   -  person Alexey Subach    schedule 22.05.2017


Ответы (1)


Рассматриваемый PDF-файл имеет три свойства, которые затрудняют заполнение:

  1. Определение формы в нем представляет собой гибридную пару определений XFA / AcroForm.
  2. Файл подписан с использованием подписи прав использования (UR3), требуемой формой XFA для сохранения.
  3. Файл зашифрован.

Обычно такие формы можно заполнить без шифрования (пункт 3), создав инкрементное обновление, т.е. работая в режиме добавления с использованием new StampingProperties().useAppendMode(). Это сохраняет подпись прав использования действующей, и все работает нормально.

К сожалению, для этого зашифрованного файла new StampingProperties().useAppendMode() и даже new StampingProperties().preserveEncryption().useAppendMode() приводят к битым файлам. Это может быть связано с тем, что newReader.SetUnethicalReading(true) используется вместо пароля владельца; но вряд ли можно ожидать ввода пароля владельца при заполнении государственной формы ...; *)

В любом случае можно продолжить заполнение этой формы.

  • удалить шифрование,
  • удалить подпись прав использования (которая была взломана удалением шифрования) и
  • удалить определение формы XFA (которое после удаления подписи прав использования больше не работает должным образом).

Результатом является PDF-файл с чистой формой AcroForm, с которой вы можете работать по своему усмотрению.

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

form.RemoveXfaForm();
pdf.GetCatalog().Remove(PdfName.Perms);

перед pdf.Close().

(Протестировано с помощью iText для .Net версии 7.0.2.2 и iText для версии Java 7.0.3-SNAPSHOT)

person mkl    schedule 22.05.2017