Почему аннотация Acroform моего PDF-документа не отображается в Acrobat Reader? - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над кодом, который генерирует документы PDF. Я работаю над созданием аннотаций флажков Acroform для редактируемых PDF-форм, и они отлично работают в большинстве читателей PDF, которые я тестирую: Chrome, Firefox, Ma c Preview и PDF Element 6. Тем не менее, я действительно изо всех сил пытаюсь получить правильное отображение в Acrobat Reader.

Я работаю над минимальным примером PDF, который содержит только один флажок и никакого другого содержимого.

Вот как выглядит испорченный PDF в Acrobat Reader при наведении курсора мыши на этот флажок:

broken PDF gif

Этот флажок по умолчанию невидим. При наведении курсора на флажок отображается граница. Но когда я нажимаю флажок, значение не является постоянным, и повторное нажатие на него ничего не делает.

Вот как это должно выглядеть (рабочий PDF из Adobe Acrobat):

working PDF gif

Вот несколько ссылок на PDF-файлы:

Я проверил оба PDF-файла, используя veraPDF . Оба PDF-файла имеют небольшое количество одинаковых ошибок проверки, поэтому это не помогло мне понять разницу.

Я даже пытался скопировать поток XObject непосредственно из рабочего PDF, и если вы посмотрите на / AP => / N => / Да, вы должны видеть, что они практически идентичны:

1 g
0 0 36.029 36.029 re
f
0.5 0.5 35.029 35.029 re
s
q
1 1 34.029 34.029 re
W
n
0 g
BT
/ZaDb 33.4305 Tf
2.853 6.3838 Td
32.8405 TL
0 0 Td
(4) Tj
ET
Q

(Это очень простой поток, который просто отображает галочку с использованием шрифта ZapfDingbats.)

К сожалению, я не могу поделиться конкретными примерами c кода. Я использую Ruby и Prawn, но у меня также есть много низкоуровневого проприетарного кода (у Prawn фактически нет поддержки аннотаций Acroform.) Мне просто нужно понять основные различия между этими PDF-файлами и выяснить, почему один сломан, а другой правильно рендерится, и тогда я смогу внести изменения в мой код.

Если вы знакомы со спецификацией PDF, я был бы очень признателен, если бы вы не посмотрели PDF-файлы, которые я разместил выше. Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 20 февраля 2020

Я наконец нашел решение! Я потратил много часов на урезание каждого PDF-файла, пока не нашел наименьшее изменение, вызвавшее эту ошибку рендеринга в Acrobat Reader. (СОВЕТ: используйте pdftk original.pdf output original-uncompressed.pdf uncompress для распаковки потоков PDF, а затем вы можете редактировать PDF в текстовом редакторе.)

Я наконец-то нашел виновника в /Root => /AcroForm => /DA. Рабочий PDF-файл содержал:

/DA (/Helv 0 Tf 0 g)

Неработающий PDF-файл имел:

/DA <feff002f00480065006c0076002000300020005400660020003000200067>

Это строка в шестнадцатеричном формате с тем же декодированным значением: /Helv 0 Tf 0 g.

Большинство программ чтения PDF автоматически декодируют эту строку без проблем (Chrome, Firefox, Ma c Preview), но Acrobat Reader по какой-то причине не поддерживает это. (Специально для атрибута /DA в /AcroForm. Он прекрасно декодирует любые другие закодированные строки.)

Я действительно изо всех сил пытался определить эту проблему, потому что многие инструменты отладки PDF (например, iText RUPS) ) автоматически декодирует эти строки и скрывает тот факт, что они были закодированы.

Я работаю над кодом генерации PDF в Ruby (используя Prawn и гем pdf-core), поэтому Исправление было очень простым.

До:

self[:DA] = '/Helv 0 Tf 0 g'

После:

self[:DA] = PDF::Core::LiteralString.new('/Helv 0 Tf 0 g')

Использование класса PDF::Core::LiteralString не позволяет Prawn кодировать строку.

После внесения этого изменения в Acrobat Reader работает соответствующий флажок:

Fixed Acrobat Reader

...