PDF使用PHP+GhostScript裁剪奇数页


PDF crop even-odd pages with PHP + GhostScript

我正在处理裁剪PDF并将其导入PDF模板的例程。我使用的是GhostScript和FPDI,它是用PHP脚本中的exec()调用的。全部运行在服务器端。

到目前为止,我能够使用GhostScript使用本文中解释的过程(设置CropBox(裁剪pdf文档。

下一步是以不同的方式裁剪文档的偶数页和奇数页。因此,我尝试了SuperUser网站上另一篇文章中解释的方法,将自定义PostScript代码传递到GhostScript:的-c参数中

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

此方法将奇数页移位28 pt,对偶数页不执行任何操作。因此,我尝试修改它,传递CropBox(es((在sprintf句子中,%s占位符被替换为适当的坐标(:

-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的有效代码,但有什么替代方案

您不能在PostScript中设置"CropBox",因为CropBox不是PostScript语言的一部分,它是特定于PDF的。

你需要发送一个/PAGE PDF标记和一个/CropBox,就像你引用的第一篇文章所说的那样。您没有设置/Install。

GhostScript可以处理通过命令行-c参数传递的PostScript文件和PostScript命令。因此,为了实现非琐碎的事情,你至少应该了解这种语言的基本知识。

从以下来源获取相关文档:《PostScript语言参考手册》第三版,如果你在生活中没有见过PostScript(我就是这样(,请参阅PostScript语言教程和食谱。

KenS向我指出:

您需要一个/EndPage过程(它确实会传递给setpagedevice(该过程需要调用pdfmark。

文档指出EndPage

在每一页的末尾执行的一个过程。在调用过程中,解释器在操作数堆栈上推送两个整数此设备以前执行的showpage计数及其原因指示进行此呼叫的情况的代码:

0-在显示页面或(语言级别3(复制页面期间

1-在复印期间(仅限语言级别2(

2-设备停用时

程序必须返回一个布尔值,指定是否传输页面图像到物理输出设备。

因此,这段代码(来自KenS之前的回答(

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

每次调用原因为0(showpage(的EndPage时,传递当前页面的CropBox(指定坐标(并返回true。否则,将不执行任何操作并返回false。这个原因码是操作数堆栈中的第一项,之后是";消耗的";在操作0 eq {true block}{false block} ifelse(等于0?(中,堆栈中没有更多内容。

因此,堆栈中的下一个值是处理的页数。我们在上面显示的代码的true部分中用另一个ifelse扩展代码:

{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文档的偶数页和奇数页,即如果我们想为原始文档的绑定提供额外的空间。