Заполните и подпишите PDF-файл, который не работает с помощью Acrobat Reader DC - PullRequest
1 голос
/ 18 июня 2020

Я спрашиваю об этом здесь, потому что, судя по моим поискам, кажется, что поддержка Adobe практически отсутствует. Согласно этому онлайн-инструменту проверки, у меня есть:

https://www.pdf-online.com/osa/validate.aspx

Совершенно действительный PDF-файл, который создается из кода. Однако при использовании Acrobat Reader D C я не могу использовать «Заполнить и подписать» - при попытке подписать возникает следующая ошибка:

The operation failed because Adobe Acrobat encountered an unknown error

Это неправильный PDF-файл:

https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/PDF/SigningNoWork.pdf

Это очень похоже на то, где работает «Заливка и подпись»:

https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/PDF/SigningWorks.pdf

Foxit Reader не имеет проблем ни с одним из них - Fill and Sign работает без сбоев.

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

Вопрос: почему не работает первый, а второй нет?

1 Ответ

2 голосов
/ 18 июня 2020

В вашем нерабочем файле все шрифты определены как

/FirstChar 30
/LastChar 255

, т.е. имеют 226 глифов. Их соответствующие массивы Ширина имеют только 224 записи, поэтому они неполные.

После добавления двух записей в каждый массив Ширина Adobe Reader здесь не запускается. эта неизвестная ошибка больше не используется во время заполнения и подписи.


Когда оператор спросил, как именно я изменил эти массивы ширины:

Я хотел, чтобы изменение имело как можно меньше побочных эффектов, поэтому Я был рад увидеть, что в рассматриваемых словарях шрифтов было пустое место, поэтому было достаточно тривиального редактирования в шестнадцатеричном формате, не нужно было перемещать косвенные объекты и обновлять перекрестные ссылки:

В каждом из этих определений шрифтов в объекты 5, 7, 9 и 11 массив Ширина является последним значением словарной статьи и заканчивается некоторым пробелом, после последней ширины у нас есть эти байты:

20 0D 0A 5D 0D 0A 3E 3E --- space CR NL ']' CR NL '>' '>'

I добавил два значения 0, используя пробел:

20 30 20 30 20 5D 3E 3E --- space '0' space '0' space ']' '>' '>'
...