2015-05-23 1 views
1

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

До сих пор я мог обрезать документы PDF с помощью GhostScript, используя процедуру, описанную в this post (установка CropBox).

Следующий шаг - обрезать по-разному четные и нечетные страницы документа. Так что я попробовал метод, описанный в this other post в суперпользователем файловой системы сайта, минуя пользовательский код 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 (ов) (в% 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" 

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

"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 

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

Error: /typecheck in --.postinstall-- 

EDIT для уточнения:

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

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

ответ

1

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

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

+0

Я опустил, чтобы сосредоточиться на моем вопросе. Конечно, когда я сказал, что могу установить CropBox, я использовал: '' C: \ Program Files (x86) \ gs \ gs9.07 \ bin \ gswin32c.exe "-sDEVICE = pdfwrite -o C: \ inetpub \ wwwroot \ ledrail \ tmp \ output.pdf -c "[/CropBox[89.28 126.252 505.92 715.428]/СТРАНИЦЫ pdfmark" -f C: \ inetpub \ wwwroot \ ledrail \ documentacio \ pdf \ documentacio_15.pdf' – Laura

+0

Вам нужен/PAGE pdfmark не a/PAGES pdfmark. СТРАНИЦЫ затрагивают * все * страницы – KenS

+0

Спасибо, KenS. Итак, есть ли другой способ - используя GhostScript - определять диапазон страниц, кроме параметров -f и '-l', которые определяют последовательные страницы? И в команде из моего последнего комментария, на какой странице будет применяться '/ PAGE'? – Laura

0

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

Получите соответствующую документацию по источникам: PostScript Language Reference Manual, 3rd ed. и PostScript Language Tutorial and Cookbook, если вы еще не видели PostScript в своей жизни (как есть случай с миром).

KenS указал мне:

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

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

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

0 - Во время страницы показа или (3 уровень этого языка) copypage

1 - Во время copypage (2 только уровень этого языка)

2 - При дезактивации устройства

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

Таким образом, этот фрагмент кода (от KENS»previous answer)

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

пропускает CropBox для текущей страницы -с координат specified- каждый EndPage вызывается с разумом 0 (SHOWPAGE) и возвращает верно. В противном случае ничего не делается и возвращает 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, другой - второй, и возвращает true в обоих случаях.

Таким образом, полный кусок 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-документа, то есть, если мы хотим, чтобы подавить дополнительные пространство для связывания оригинала.