PDF使用PHP + GhostScript裁剪奇偶页面

时间:2015-05-23 14:33:02

标签: php pdf ghostscript postscript

我正在研究裁剪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有效代码,但还有什么替代方案?

2 个答案:

答案 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文档的偶数和奇数页面进行不同的裁剪,即如果我们想要压缩额外的空间来绑定原始文件。