我正在研究裁剪PDF的例程,并将它们导入PDF模板。我正在使用GhostScript,使用PHP脚本中的exec()
和FPDI进行调用。所有正在运行的服务器端。
到目前为止,我可以使用this post(设置CropBox
)中说明的程序使用GhostScript裁剪pdf文档。
下一步是对文档的偶数页和奇数页进行不同的裁剪。所以我尝试了在SuperUser站点的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 pt,对偶数页不执行任何操作。所以,我尝试修改它,传递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有效代码,但还有什么替代方案?
答案 0 :(得分:1)
您无法在PostScript中设置'CropBox',因为CropBox不是PostScript语言的一部分,而是特定于PDF的。
你需要发送带有/ CropBox的/ PAGE pdfmark,就像你引用的第一篇文章所说的那样。您没有设置/ Install。
答案 1 :(得分:0)
GhostScript可以在命令行处理通过-c参数传递的PostScript文件和PostScript命令。所以,为了实现非平凡的事情,你至少应该理解这种语言的基础知识。
如果您在生活中没有看过PostScript,那么请获取相关文档来源:PostScript Language Reference Manual, 3rd ed.和PostScript Language Tutorial and Cookbook。
KenS指出我:
你需要一个/ EndPage程序(它传递给setpagedevice) 并且该程序需要调用pdfmark。
文档声明 EndPage 是
每页末尾要执行的程序。在打电话之前 过程,解释器在操作数栈-a上推两个整数 此设备以前的showpage执行次数和原因 代码表明正在进行此调用的情况:
0 - 在showpage或(LanguageLevel 3)copypage
期间1 - 在copypage期间(仅限LanguageLevel 2)
2 - 设备停用
程序必须 返回一个布尔值,指定是否传输页面图像 到物理输出设备。
所以,这段代码(来自KenS&#39; previous answer)
<</EndPage {0 eq {[/CropBox [0 0 612 792] /PAGE pdfmark true}{false}ifelse}>> setpagedevice
为当前页面传递CropBox
- 指定坐标 - 每次{0}调用原因0(showpage)并返回true。否则,什么也没做,返回false。这个原因代码是操作数堆栈中的第一个项目,在它被消费后#34;在操作EndPage
(等于0?)中,堆栈中不再存在。
因此,堆栈中的下一个值是处理的页数。我们使用上面显示的0 eq {true block}{false block} ifelse
部分代码中的另一个ifelse
扩展代码:
true
执行当前页面(堆栈顶部)和2之间的模数,然后测试是否等于0(即测试奇数/偶数页面)。如果even(模数= 0)通过第一个{2 mod 0 eq {[/CropBox [0 0 612 792] /PAGE pdfmark true}
{[/CropBox [50 0 612 792] /PAGE pdfmark true} ifelse}
,则第二个,并在两种情况下都返回true。
所以,完整的PostScript代码:
CropBox
当在GhostScript中传递为-c参数时,允许我们对PDF文档的偶数和奇数页面进行不同的裁剪,即如果我们想要压缩额外的空间来绑定原始文件。