Форма PDF больше не редактируется после частичного заполнения - PullRequest
0 голосов
/ 01 ноября 2018

У меня проблема с веб-API, который у меня есть, который получает документ PDF (форму PDF) в виде строки в кодировке base64, превращает ее в файл, заполняет некоторые поля (используя iTextSharp PdfStamper class) и отправляет результат обратно в виде строки в кодировке base64, где он снова преобразуется в файл.

Когда я пытаюсь впоследствии открыть этот файл / документ с помощью Foxit Reader , я все еще могу редактировать поля, но при попытке сделать то же самое с Adobe Acrobat Reader , поля больше не являются редактируемые.

При открытии страницы свойств и просмотре свойств безопасности для документа в Foxit Reader он говорит, что все разрешено. Однако, делая то же самое в Adobe Acrobat Reader , он говорит, что комментировать, заполнять поля и подписывать нельзя (что было до отправки в API).

К сожалению, я не могу определить, какой PDF-ридер используют конечные пользователи, поэтому мне нужно, чтобы он был универсальным.

Я вижу, что многие другие писали о подобных проблемах, но я не вижу там своей конкретной проблемы.

Кто-нибудь знает, что здесь происходит и как обойти это?

РЕДАКТИРОВАТЬ: код добавлен

Я делаю это (немного упрощенно, но то же самое):

PdfReader reader = new PdfReader("path to PDF form file");

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create));

AcroFields form = stamp.AcroFields;

IDictionary<string, AcroFields.Item> fs = form.Fields;

foreach (var f in fs)
{
    form.SetField(f.Key, "some value");
}

stamp.Close();

РЕДАКТИРОВАТЬ: добавлены образцы файлов PDF

Файлы примеров просто найдены в Интернете, насколько я помню, они были связаны в другом посте здесь.

Я попытался заполнить 2 поля (имя и фамилия) в этой PDF-форме.

Файл first - это форма, созданная из строки base64.

d94b6076-983d-47db-b496-a0ba383deda4.pdf

Файл second выводится после заполнения 2 полей.

d94b6076-983d-47db-b496-a0ba383deda4_filled.pdf

1 Ответ

0 голосов
/ 02 ноября 2018

Ваш PDF-файл содержит гибридное определение формы AcroForm / XFA и подпись прав на использование. Оба факта усложняют заполнение форм.

Подпись прав использования

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

Если подпись признана недействительной, Adobe Reader не только не активирует эти дополнительные функции, но даже деактивирует некоторые другие функции, в противном случае активные для неподписанных документов.

Вы создаете PdfStamper вот так

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create));

Этот конструктор не инициализирует печать в режиме append . Таким образом, штампованный PDF в конечном итоге записывается как новый PDF. Это делает недействительной подпись прав на использование, а Adobe Reader ограничивает возможности при повторном открытии PDF.

Кстати, при открытии PDF с помощью Adobe Reader программа сообщает вам следующее:

Adobe Reader pop-up

Если вы поставите штамп в режиме append , подпись прав на использование не будет аннулирована. Вы можете сделать это, используя другой конструктор:

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create), '\0', true);

Финал true активирует режим добавления.

В качестве альтернативы вы можете удалить подпись прав на использование

PdfReader reader = new PdfReader("path to PDF form file");
reader.RemoveUsageRights();

Результат больше не имеет подписи с правами на использование, в частности, недействительной подписи. Таким образом, Adobe Reader предлагает свои стандартные функции для этого файла.

К сожалению, сохранение форм XFA не входит в их число, поэтому PDF-файл можно редактировать, но не сохранять в Adobe Reader. Это может быть не то, что вы хотите.

Об этих параметрах также см., Например. этот старый ответ ; в этом ответе говорится о «включении считывателя», что в Adobe означает «применение подписи прав использования».

Определение гибридной формы XFA / AcroForm

Файл содержит определение двойной формы, одно определение формы AcroForm, которое является собственным типом формы PDF, и одно определение формы XFA, которое представляет собой формат XML, использующий PDF просто в качестве транспортного контейнера.

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

В этом случае вы можете удалить определение формы XFA и использовать только AcroForm.

reader.Catalog.GetAsDict(PdfName.ACROFORM).Remove(PdfName.XFA);

При таком подходе, пожалуйста, прочитайте этот ответ и эту статью iText .

...