如何使用ghostscript以多页pdf裁剪第3页和第4页

时间:2016-10-27 19:05:29

标签: pdf ghostscript

我想在多页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>

1 个答案:

答案 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

它不是世界上最好的解决方案,但它对我有用。