我想在多页pdf中裁剪一些页面,保留所有页面,一些裁剪,其他页面不裁剪。我尝试了以下内容,但它“删除”了非裁剪页面......
Toolbar#getMenu()
我在奇数页和偶数页上看过不同裁剪的帖子,但我无法弄清楚如何将其应用于多页文档中的某个页面。
gswin64.exe -o cropped.pdf -sDEVICE=pdfwrite -dFirstPage=3 -dLastPage=4 -c "[/CropBox [24 72 1559 1794]" -c " /PAGES pdfmark" -f input.pdf
这会根据第二个CropBox的设置裁剪所有页面。如果有人想知道大的利润......我应用这个做大图。 我还尝试用一些操作符替换只将裁剪应用到某个页码:“sub 4”而不是“2 mod”是仅当当前页码达到4时才获得“0 eq”条件的尝试。 / p>
答案 0 :(得分:0)
首先确定,Ghostscript和pdfwrite设备不会“修改”输入PDF文件。对于普通读者;这里的标准讲座,如果你已经阅读过,那么你可以跳过以下段落。
这种方式的工作方式是将输入文件完全解释为一系列图形基元,并将其发送到设备。渲染设备然后调用图形库将基元渲染到位图,然后输出。高级(矢量)设备(例如pdfwrite)将基元转换为某些高级页面描述语言中的等效操作,并将其发出。
因此,当您选择-dFirstPage和-dLastPage时,这些是您选择处理的输入文件的仅页面。因此,pdfwrite不会“删除”您的网页,您从未将它们首先发送到设备。
现在,Ghostscript是一个PostScript解释器,因此编写PostScript程序会影响其操作。在您的情况下,您可能希望实际处理所有页面(所以删除-dFirstPage和-dLastPage),但只在所选页面上写入pdfmark。
执行此操作的方法是通过BeginPage或EndPage过程。如果您在此处或在PostScript标签中搜索,您会找到许多示例。从根本上说,这两个程序都是用原因码和目前的页数来调用的。
从内存中你需要检查原因代码是2.如果是,那么你要检查页数,它是否符合你的标准(在这里,计数是3或4),执行/ PAGE pdfmark。在任何情况下,您都希望返回“true”,以便发出页面。
[EDIT在这里添加]
嗯,好的,我看到了问题。发生的事情是PDF解释器调用'setpagedevice'来设置每个页面的页面大小,以防页面大小发生变化。问题是每次都会将页面计数重置为0.现在,我通常不会建议以下内容,因为它依赖于Ghostscript的PDF解释器的一些未记录的方面。但是,我碰巧知道PDF解释器使用名为/ Page#。
的命名对象在内部跟踪页码所以,如果我拿你写的代码,稍微修改一下:
<<
/EndPage {
0 eq {
pop /Page# where {
/Page# get
3 eq {
(page 3) == flush
[/CropBox [0 0 1612 1792] /PAGE pdfmark
true
}
{
(not page 3) == flush
[/CropBox [500 500 612 792] /PAGE pdfmark
true
} ifelse
}{
true
} ifelse
}
{
false
}
ifelse
}
>> setpagedevice
要注意的事情;那里有一些调试,带有'== flush'的行在后面的通道上打印出一些内容,这样你就知道每个页面的处理方式。如果没有定义/ Page#,那么代码就会把所有东西都留下来,这只是一些基本的安全第一的东西。
不是在命令行上键入所有这些(也会丢失缩进并且难以阅读),而是将其粘贴在名为test.ps的文件中,然后将GS调用为:
gswin32c -sDEVICE=pdfwrite -sOutputFile=out.pdf test.ps input.pdf
它不是世界上最好的解决方案,但它对我有用。