如何从PDF文件中删除图像

我有一个相当大的(约100MB)PDF文档,里面有很多图片(作为插图和背景图片),我想要一份没有图片的pdf副本,但是我不知道如何做到这一点。
我不是说要将其转换为纯文本,我希望保留段落/表格/多列的原样。
我对命令行很熟悉,并且有几台不同发行版的计算机可以使用。

由于我们正在讨论的是一个有500页且每页都有多张图片的文档,我正在寻找一种自动化的方法来删除每一张图片。 - Ornux
4个回答

最新版本的Ghostscript也可以做到这一点。只需在命令中添加参数-dFILTERIMAGE即可。
甚至还有两个新参数可以添加,以选择性地删除内容类型"vector"和"text":
  1. -dFILTERIMAGE:生成一个去除所有光栅图像的输出。

  2. -dFILTERTEXT:生成一个去除所有文本元素的输出。

  3. -dFILTERVECTOR:生成一个去除所有矢量绘图的输出。

这些选项中可以任意组合两个。(如果将这三个选项都组合起来,所有页面都会被清空...)

示例

以下是一个示例PDF页面的屏幕截图,其中包含了上述3种类型的内容。

原始PDF页面的截图包含"图像"、"矢量"和"文本"元素。
原始PDF页面的截图,包含"图像"、"矢量"和"文本"元素。


运行以下6个命令将创建剩余内容的所有6种可能变体:
gs -o noIMG.pdf   -sDEVICE=pdfwrite -dFILTERIMAGE                input.pdf
gs -o noTXT.pdf   -sDEVICE=pdfwrite -dFILTERTEXT                 input.pdf
gs -o noVCT.pdf   -sDEVICE=pdfwrite -dFILTERVECTOR               input.pdf
gs -o onlyIMG.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERTEXT input.pdf gs -o onlyTXT.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERIMAGE input.pdf gs -o onlyVCT.pdf -sDEVICE=pdfwrite -dFILTERIMAGE -dFILTERTEXT input.pdf

下面的图片说明了结果:


上排,从左到右:所有的“文本”都被删除了;所有的“图像”都被删除了;所有的“矢量图”都被删除了。 下排,从左到右:只保留了“文本”;只保留了“图像”;只保留了“矢量图”。
上排,从左到右:所有的“文本”都被删除了;所有的“图像”都被删除了;所有的“矢量图”都被删除了。下排,从左到右:只保留了“文本”;只保留了“图像”;只保留了“矢量图”。



cpdf -draft original.pdf -o version_without_images.pdf

虽然它不在软件仓库中,但你可以在他们的网站上找到一个下载(预编译版本源代码)。


手册

15.1 Draft Documents

The -draft option removes bitmap (photographic) images from a file, so that it can be printed with less ink. Optionally, the -boxes option can be added, filling the spaces left blank with a crossed box denoting where the image was. This is not guaranteed to be fully visible in all cases (the bitmap may be have been partially covered by vector objects or clipped in the original). For example:

 cpdf -draft -boxes in.pdf -o out.pdf

1那正是我在寻找的东西!输出文件简直完美。非常感谢你! - Ornux
@Rinzwind 请注意,“他们的网站”链接实际上是一个压缩文件。 - Jos
嗯...对我来说,它总是在文本上方和跨越文本之间添加几乎随机的行,而且文件大小实际上会略微增大,而不是缩小。 - Henning Koehler

虽然@Rinzwind的回答是正确的事情,但我想评论一下“中途”解决方案。您通常可以使用ghostscript大大减小图像的大小。
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
   -dNOPAUSE -dQUIET -dBATCH -sOutputFile=small.pdf original.pdf

有时候它确实非常方便进行校对。撰写PDF的手册页面在这里

@KurtPfeifle /screen会将位图图像的分辨率设置为72dpi,除此之外还有其他功能。所以,如果您的图像分辨率较低,它可能会增加文件大小。这就是为什么我使用了“通常”这个词(意思是“不总是,但很常见”)。随意给任何你想要的东西点踩。 - Rmano
运行以下命令:for s in screen default ; do gs -o /dev/null -sDEVICE=pdfwrite -dPDFSETTINGS=/${s} -c "currentpagedevice {exch ==only ( ) print === } forall" | sort | tee ghostscript---pdfwrite-PDFSETTINGS-${s}--pagedevice-settings.txt; done。它将生成两个文本文件,您可以使用sdiff -sbB $[file1}.txt ${file2}.txt进行比较。现在,您完全了解-dPDFSETTINGS=/screen引入的所有不同设置! - Kurt Pfeifle
完成了。仍然看不出哪个选项可以在/screen中生成比/default更大的文件——72dpi与150dpi,优化,丢弃EPS预览...但嘿,这不是个大问题。人们会测试并选择更好的解决方案。 - Rmano
对不起 - 或许我现在得为我第一次发言的无礼道歉。老实说,我只是似乎从我以前的调查中记得(几年前),/screen 的结果非常糟糕。可能是我的记忆出错了,或者我把它和 /epub 混淆了。我给你的命令是根据记忆输入的,因为我相当确定它会显示我想要的内容。现在我重新运行了一遍,我再也看不到我期望的结果了:多年前我进行了更多的扩展测试。然后大量的(CID?/CFF?)字体被光栅化,导致生成的PDF文件大小膨胀。一旦我有更多时间,我必须再次重新审视这个问题... :-) - Kurt Pfeifle

你可以使用Master PDF Editor(适用于Windows,Linux和macOS):
  1. 打开PDF文件
  2. 删除图片
  3. 另存为新的PDF文件
你可以从Ubuntu软件中心下载它。

我只是安装它来试试,但是我没有看到任何自动化的方法来做这个。考虑到这是一个500页的文档,我不认为手动删除是一个解决办法。我有什么遗漏吗? - Ornux
不,你没有错过任何东西。我以为图片都很大,所以你想要删除它们,从没想到会有这么多图片。无论如何,问题问得很好。 - Sudheer