如何在Mac上通过编程方式从PDF文档中删除页面?

7

我有一堆PDF文档,它们都包含一个我想要删除的封面页。

有没有办法以编程方式将它们删除?

我发现大多数PDF工具只能合并文档,而不能删除页面。在打印对话框中,我可以选择第2页到最后一页,然后打印到文件,但我找不到任何以编程方式访问此功能的方法。

3个回答

11

使用pdftk工具。

要删除第8页:

pdftk in.pdf cat 1-7 9-end output out.pdf

2
顺便说一句,如果还有其他人也懒得自己编译pdftk(macport仍然无法解决gcc42的问题),这里提供一个二进制文件http://fredericiana.com/2010/03/01/pdftk-1-41-for-mac-os-x-10-6/ - ceiling cat

7

仅供记录:您也可以使用Ghostscript:

gs \
  -o removed-page-1-from-input.pdf \
  -sDEVICE=pdfwrite \
  -dFirstPage=2 \
  /path/to/input.pdf

然而,pdftk是更好的工具来完成这项任务(并且已经向您推荐了该工具)。

此外,这个Ghostscript命令行可以改变输入PDF的一些属性,因为它本质上是重新压缩的。这可能是需要的更改,也可能不是。要控制这种行为的各个方面(或抑制其中的一些方面),需要使用更复杂的带有更多参数的命令行。

pdftk将每页重用原始PDF对象。


更新

Ghostscript还有一个额外的参数-dLastPage。与-dFirstPage一起使用,这允许提取页面范围。

最新版本增加了一个新参数-sPageList。可以像这样使用:

-sPageList="1, 5-10, 12-"

从输入文档中提取页面1、5-10和12以后的页面。不过,我没有(尚未)亲自测试过这个新功能,也不确定它的可靠性。
对于旧版本的Ghostscript(以及最新版本),可以在同一GS调用中多次使用相同的输入PDF并使用不同的参数来提取文档中非连续页面选择。甚至可以通过此方法组合来自不同文档的页面。
gs \
  -o selected-pages.pdf \
  -sDEVICE=pdfwrite     \
  -dFirstPage=2         \
  -dLastPage=2          \
   in1.pdf              \
                        \
  -dFirstPage=10        \
  -dLastPage=15         \
   in1.pdf              \
                        \
  -dFirstPage=1         \
  -dLastPage=1          \
   in1.pdf              \
                        \
  -dFirstPage=4         \
  -dLastPage=6          \
   in2.pdf

注意事项:将使用非嵌入式字体或相同字体名称但具有不同编码和/或不同子集(具有相同字体名称前缀)的不同文档中的页面合并可能导致结果中的 PDF 文件出现错误。


1
如果一个PDF有4页,而我只想删除第3页呢?我猜这样不行。唯一的其他选择就是提取1至2页和第4页,然后再粘合在一起。如果我们使用的是GS,那么就可以这样做。 - Souvik Ghosh
1
@SouvikGhosh:新版本的Ghostscript支持一个新参数:***-sPageList="1, 5-10, 12-"*** -- 可以处理输入文件的第1页、第5-10页和第12页到最后一页。然而,我从未真正测试过它,所以我不知道它的可靠性如何。对于旧版本,您可以使用不同的参数多次向同一GS调用提供输入PDF:***gs -o a.pdf -sDEVICE=pdfwrite -dFirstPage=1 -dLastPage=1 in.pdf -dFirstPage=5 -dLastPage=10 in.pdf -dFirstPage=12 in.pdf*** 来实现相同的结果... - Kurt Pfeifle
当然,您可以将相同的技术应用于处理不同页面范围的不同输入文件,并将其合并为一个输出文档。 - Kurt Pfeifle
我点赞了回答我的特定问题的评论,但是确实,主要答案也值得一个。干杯! - Souvik Ghosh

0

-[PDFDocument removePageAtIndex:] 看起来应该可以实现这个功能。顺便说一下,Preview.app 可以删除页面,但它不可编写脚本,因此这不是一个编程解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接