Я использую named action
вместо javascript, потому что javascript часто отключен, а если нет, выдает предупреждение.
Мое веб-приложение создает файл postscript, который затем преобразуется с помощью ghostscript в pdf. Я хочу, чтобы он печатался автоматически, потому что пользователь уже нажал на печать внутри моего приложения. С информацией о названных действиях от @DSimon выше, я исследовал, как решить эту проблему. Все сводится к вставке строки /Type /Action /S /Named /N /Print
в нужном месте в PDF.
Я думал о написании небольшой утилиты, но она должна проанализировать pdf-файл, чтобы найти корневой узел, вставить /OpenAction
со ссылкой на объект с действием и пересчитать смещения байтов в xref.
Но потом я узнал о pdfmark , который является расширением постскриптума для выражения в синтаксисе постскриптама идиом, которые преобразуются в pdf дистиллятором Adobes или ghostscript.
Поскольку я уже использую ghostscript, все, что мне нужно сделать, это добавить следующее в конец моего файла postscript:
%AUTOPRINT
[ /_objdef {PrintAction} /type /dict /OBJ pdfmark
[ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark
[ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark
и ghostscript создаст действие, свяжет его и рассчитает смещения внешних ссылок. (В постскриптуме %
- это комментарий, а PrintAction
- мое имя для объекта)
Глядя на PDF, я вижу, что он создал это:
1 0 obj
<</Type /Catalog /Pages 3 0 R
/OpenAction 9 0 R
/Metadata 10 0 R
>>
endobj
9 0 obj
<</S/Named
/Type/Action
/N/Print>>endobj
1 0
- это объект 1, редакция 0, а 9 0
- это объект 9, редакция 0. В pdf-трейлере говорится, что это объект 1, который является корневым узлом. Как вы можете видеть, есть ссылка от объекта 1 /OpenAction
на запуск объекта 9 ревизии 0.
С помощью ghostscript можно конвертировать pdf в postscript (pdf2ps), добавлять текст выше и конвертировать его обратно в pdf с помощью ps2pdf
. Следует отметить, что мета-информация о PDF теряется в этом преобразовании. Я не искал больше в этом.