Вставьте номер страницы в каждую страницу файла PDF с помощью Ghostscript - PullRequest
0 голосов
/ 14 мая 2018

В настоящее время я работаю над функцией, которая будет вставлять номер страницы в PDF через ghostscript. В качестве первого подхода я пытался следовать тем же командам, что и для вставки водяного знака на страницу каждого файла, - следующим образом:

gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf watermark.ps in.pdf

В этом случае водяной знак будет напечатан на странице каждого файла - такое поведение я ожидал. Однако для печати номера страницы на каждой странице используется инкрементный номер, который будет напечатан на каждой странице, например, для каждой страницы должен быть напечатан другой номер. В настоящее время мой код выглядит так:

<<
   /EndPage
   {
     2 eq { pop false }
     {
         gsave      
         /Arial 8 selectfont
         550 820 moveto (page 1) show
         grestore
         true
     } ifelse
   } bind
>> setpagedevice

И команда для вызова этого почти такая же для водяного знака, просто изменив второй параметр:

gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf pages.ps in.pdf

Я пытаюсь вставить параметры в этот файл "pages.ps" для динамической печати страниц. Примерно так:

550 820 moveto (attr[0]) show

И вызов через командную строку так:

gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf pages.ps "pageNumber" in.pdf

К сожалению, это не работает!

Я борюсь с этим в течение нескольких дней, и любая помощь будет оценена. Любой другой подход будет также полезен.

Ура!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

Использование ARGUMENTS

Ghostscript имеет особое поведение при вызове с аргументом --.

$ gs -q -- prog.ps 1 2 3

Затем программа может получить доступ к этим аргументам в виде массива строк с именем ARGUMENTS.

%!
ARGUMENTS ==

Эта программа напечатает

[ (1) (2) (3) ]

для вышеуказанного ввода.

Использование -d или -s

Этот способ, вероятно, лучше для ваших нужд. Вы можете использовать -sname=string, чтобы выполнить эквивалент /name (string) def, прежде чем переходить к следующему элементу командной строки. Используйте -s для строк и -d для любого другого вида маркера postscript, который необходимо отсканировать и интерпретировать.

Так что, вероятно, вы хотите сделать что-то вроде этого:

$ gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf -sattr=pageNumber pages.ps in.pdf

Тогда page.ps может получить доступ к этой строке просто как attr. Индексирование массива PostScript в любом случае не использует [0], вместо этого используется оператор get.

Использование -c

Вы также можете использовать опцию -c, чтобы выполнить небольшой фрагмент, такой как -c"/attr (pageNumber) def".

0 голосов
/ 14 мая 2018

Вы не сказали, как это не работает, или опубликовали примеры, чтобы показать, в чем проблема, или действительно опубликовали пример «pages.ps».

Что сделает ваша команда show 550 820 moveto (attr[0]) show, так это буквально напечатает текст 'attr [0]' в точке 55,820 в пространстве пользователя.

Что ты ожидал от этого?

...