Я работаю в обычном режиме для обрезки 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, но каковы альтернативы?
Вы не можете установить ‘CropBox’ в PostScript, потому что CropBox не является частью языка PostScript, его специфичен для PDF.
Вам необходимо отправить / PAGE pdfmark с / CropBox, как указано в первом сообщении, на которое вы ссылаетесь. Вы не установите / Установить.
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, т. е. если мы хотим уменьшить лишнее пространство для привязки оригинала.