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