Как добавить PostScript XObject в PDF? - PullRequest
3 голосов
/ 17 апреля 2011

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

5 0 obj
<< /Type/XObject
   /Subtype/PS
   /Length 103
>>
stream
/Times findfont 10 scalefont setfont
/str 32 string def
10 20 moveto
rand str cvs show
endstream
endobj

Каждый раз, когда любой просмотрщик PDF, с которым я проверял это, читает этот объект, я получаю такие ошибки, как: «Ошибка (741): отсутствует« конечный поток »» »И аналогично для каждого токена в этом потоке. Я уверен, что мои смещения верны. И хотя я знаю, что мой просмотрщик PDF поддерживает некоторые PS для форм и тому подобное, есть ли что-то явно неправильное. Если у кого-нибудь есть образец PDF, из которого я могу пойти, это было бы неплохо. Примеры форм, с которыми я проверял своего читателя, были не слишком полезны. Если я запускаю только код PS из GhostView, он работает нормально. Спасибо за понимание.

1 Ответ

4 голосов
/ 19 апреля 2011

Я просмотрел свою заднюю коллекцию PDF-файлов и получил 2, которые содержат PS XObjects (это действительно устарело). К сожалению, я не могу поделиться ими, поскольку они являются файлами данных клиентов: - (

Однако вот выдержка из одного из них:

74 0 obj
<<
/Type /XObject
/Subtype /PS
/Filter /FlateDecode
/Length 77 0 R
/Name /Ps1
>>
stream
....endstream

Примечание 1: между концом данных и токеном «конечный поток» нет EOL.

77 0 obj
4480
endobj

Смещение 0x0A после токена 'stream' равно 0xdab15, смещение 'e' в конечном потоке составляет 0xdbc96. Это 4481 байт. Поэтому мне кажется, что / Длина должна содержать все байты после EOL для токена 'stream' 'вплоть до последнего байта перед' e 'в токене конечного потока.

Я думаю, что было бы хорошо вставить 0x0A после данных потока и перед конечным потоком. Это может привести к появлению пробела после потоковых данных перед токеном, и предполагается, что PDF допускает пробелы.

Это согласуется с описанием записи / Length для потоковых словарей в Таблице 3.4 (p62 из ссылки 1.7 PDF):

Количество байтов от начала строки, следующей за потоком ключевых слов, до последнего байта непосредственно перед конечным потоком ключевого слова. (Может существовать дополнительный маркер EOL, предшествующий конечному потоку, который не включен в счетчик и не является логически частью данных потока.) См. «Объем потока» выше для дальнейшего обсуждения.

Я думаю (если я правильно посчитал), что / Длина в вашем примере должна быть 87, при условии, что в фрагменте PostScript используется один конец строки байтов.

...