PDF обрезать четные и нечетные страницы с помощью PHP + GhostScript

Я работаю в обычном режиме для обрезки PDF-файлов и импорта их в шаблон PDF. Я использую GhostScript, вызванный с exec() из сценария PHP и FPDI. Все работает на стороне сервера.

Пока что я могу обрезать PDF-документы с помощью GhostScript, используя процедуру, описанную в эта почта (настройка CropBox).

Следующим шагом будет по-разному обрезать четные и нечетные страницы документа. Поэтому я попробовал метод, описанный в этот другой пост на сайте SuperUser, передавая собственный код PostScript в параметр -c в GhostScript:

-c "<< /CurrPageNum 1 def /Install { /CurrPageNum CurrPageNum 1 add def
CurrPageNum 2 mod 1 eq {28 0 translate} {} ifelse } bind  >> setpagedevice"

Этот метод сдвигает нечетные страницы на 28 пунктов и ничего не делает для четных страниц. Итак, я попытался изменить это, передав CropBox (es) (заполнители% s заменены соответствующими координатами в sprintf предложение):

-c "<< /CurrPageNum 1 def /Install { /CurrPageNum CurrPageNum 1 add def
CurrPageNum 2 mod 1 eq {[/CropBox [%s %s %s %s]} {[/CropBox [%s %s %s %s]}
ifelse } bind  >> setpagedevice"

Вот полная команда, выполненная над 4-страничным PDF-файлом:

"C:\Program Files (x86)\gs\gs9.07\bin\gswin32c.exe" -sDEVICE=pdfwrite
-o C:\inetpub\wwwroot\ledrail\tmp\output.pdf
-c "<< /CurrPageNum 1 def /Install { /CurrPageNum CurrPageNum 1 add def
CurrPageNum 2 mod 1 eq {[/CropBox [119.04 168.336 505.92 715.428]}
{[/CropBox [59.52 84.168 505.92 715.428]} ifelse } bind >> setpagedevice"-f C:\inetpub\wwwroot\ledrail\documentacio\pdf\documentacio_15.pdf

Очевидно, я получаю ошибку, потому что [/CropBox... не является действительным кодом PS.

Error: /typecheck in --.postinstall--

РЕДАКТИРОВАТЬ для уточнения:

Итак, мой вопрос: как я могу пройти эквивалент два CropBox (ов) — для нечетных и четных страниц — для кода PostScript, показанного выше? Или есть другой метод для достижения этой цели с GhostScript из командной строки?

Очевидно, я знаю, что CropBox не является допустимым кодом PostScript, но каковы альтернативы?

1

Решение

Вы не можете установить ‘CropBox’ в PostScript, потому что CropBox не является частью языка PostScript, его специфичен для PDF.

Вам необходимо отправить / PAGE pdfmark с / CropBox, как указано в первом сообщении, на которое вы ссылаетесь. Вы не установите / Установить.

1

Другие решения

GhostScript может обрабатывать файлы PostScript и команды PostScript, передаваемые через параметр -c в командной строке. Таким образом, чтобы достичь чего-то нетривиального, вы должны понимать хотя бы основы этого языка.

Получите соответствующую документацию из источников: Справочное руководство по языку PostScript, 3-е изд. и Учебник и поваренная книга по языку PostScript если вы не видели PostScript в своей жизни (как в случае с mi).

KENS указал мне:

Вам нужна процедура / EndPage (которая передается в setpagedevice)
и эта процедура должна вызвать pdfmark.

Документы утверждают, что EndPage является

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

0 — во время показа или (LanguageLevel 3) копирование

1 — во время копирования (только LanguageLevel 2)

2 — при отключении устройства

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

Итак, этот фрагмент кода (из KenS ‘ предыдущий ответ)

<</EndPage {0 eq {[/CropBox [0 0 612 792] /PAGE pdfmark true}{false}ifelse}>> setpagedevice

проходит CropBox для текущей страницы — с указанными координатами — каждый раз EndPage вызывается с причиной 0 (showpage) и возвращает true. В противном случае ничего не делается и возвращает false. это код причины это первый элемент в стеке операндов, и после того, как он «потребляется» в операции 0 eq {true block}{false block} ifelse (равно 0?), в стеке больше нет.

Итак, следующее значение в стеке — это количество обработанных страниц. Расширяем код другим ifelse внутри true часть кода, показанного выше:

{2 mod 0 eq {[/CropBox [0 0 612 792] /PAGE pdfmark true}
{[/CropBox [50 0 612 792] /PAGE pdfmark true} ifelse}

Это выполняет модуль между текущей страницей (на вершине стека) и 2, а затем проверяет, равно ли 0 (то есть проверяет нечетную / четную страницу). Если даже (модуль = 0) проходит первый CropBox, иначе второй, и возвращает истину в обоих случаях.

Итак, полный кусок кода PostScript:

"<</EndPage {0 eq {2 mod 0 eq {[/CropBox [0 0 612 792] /PAGE pdfmark true}
{[/CropBox [50 0 612 792] /PAGE pdfmark true} ifelse}{false}ifelse}>> setpagedevice"

при передаче в GhostScript в качестве параметра -c мы можем по-разному обрезать четные и нечетные страницы документа PDF, т. е. если мы хотим уменьшить лишнее пространство для привязки оригинала.

0

По вопросам рекламы [email protected]