如何在PDF文件中降低图像分辨率?

35
需要一个基于Java的解决方案或者在Linux上至少需要一个命令行工具。
我尝试使用Ghostscript:
gs -sDEVICE=pdfwrite -dPDFA -dBATCH -dNOPAUSE -dUseCIEColor \
   -sProcessColorModel=DeviceCMYK -sPDFACompatibilityPolicy=1 \
   -sOutputFile=downgraded.pdf leon_range_my12_w22_brochure.pdf

但是我得到了很多错误...


3
这些参数不会对图像进行降采样。您使用的GS版本是什么,并且已将错误报告为错误吗?-dPDFA开关需要额外的信息来创建符合PDF / A文件,您尚未提供。可能“错误”实际上是警告... - KenS
5个回答

59

这里是一个示例,展示了如何使用Ghostscript命令行将所有(彩色、灰度和单色)图像降采样为72dpi:

gs \
  -o downsampled.pdf \
  -sDEVICE=pdfwrite \
  -dDownsampleColorImages=true \
  -dDownsampleGrayImages=true \
  -dDownsampleMonoImages=true \
  -dColorImageResolution=72 \
  -dGrayImageResolution=72 \
  -dMonoImageResolution=72 \
  -dColorImageDownsampleThreshold=1.0 \
  -dGrayImageDownsampleThreshold=1.0 \
  -dMonoImageDownsampleThreshold=1.0 \
   input.pdf

更新:
*ImageDownsampleThreshold=1.0 参数会强制将所有分辨率高于目标分辨率 72 dpi 的图像进行降采样。如果未提供此参数(或设置为其他值),则将使用默认值:*ImageDownsampleThreshold=1.5。这个默认值仅会将分辨率达到 108 dpi 或更高的图像进行降采样,而不会对其余图像做出改变。


@codin:评论不适合讨论全新的话题。请提出一个新问题,标记为“[ghostscript]”+“[pdf]”,我会尽力回答。请同时说明您请求的目的。节省文件大小?删除图像中包含的信息?还是其他? - Kurt Pfeifle
谢谢Kurt,非常好的回答!我尝试将图像分辨率降低到36,但输出文件的大小没有改变,即使第一页中的图像占据了其70%的大小。有什么想法为什么会这样? - coccoinomane
1
@GuidoWalterPettinari:没有PDF本身的访问权限,我不会猜测。也许您可以将以下答案应用于您的文件,以便缩小占用其字节大部分的元素范围:https://dev59.com/ZF0b5IYBdhLWcg3wENiK#37858893 - Kurt Pfeifle
谢谢Kurt,这是非常有用的资源!我不知道Ghostscript有一个简单的命令可以从PDF中剥离图像。我会研究一下。 - coccoinomane
1
@GuidoWalterPettinari:在StackOverflow上表达“感谢”的官方方式是给有用的答案点赞 :-) - Kurt Pfeifle

17

这是我正在使用的命令:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=OUTPUT.pdf INPUT.pdf

供您参考:

-dPDFSETTINGS=/screen (仅适用于屏幕查看的质量,72 dpi 图像)

-dPDFSETTINGS=/ebook (低质量,150 dpi 图像)

-dPDFSETTINGS=/printer(高质量,300 dpi 图像)

-dPDFSETTINGS=/prepress(高质量,保留颜色,300 dpi 图像)

-dPDFSETTINGS=/default(几乎与 /screen 相同)


3
尝试使用moonshiner,它是一个ghostscript的GUI界面。

虽然在2009年的Sourceforge上,Moonshiner看起来很有前途,在其5个月的开发活动中表现出色,但现在它似乎是一个已经停滞不前的项目。自2009年5月以来没有任何更新... :-( - Kurt Pfeifle
2
@pipitas 我没有对Moonshiner做出任何重大更改,因为在我看来它几乎已经完成了。我同意缺乏活动使它看起来已经死亡,但我仍然广泛地使用它至今。我只是没有什么需要再添加的了 :) - balpha
1
@balpha:你有没有了解Ghostscript在此期间所获得的ICC配置文件嵌入和OutputIntents处理方面的广泛支持? - Kurt Pfeifle
@balpha:你可以在某个地方提到这个。 - user283145

2
对于每页都是全彩图像的扫描文档,我使用了上述命令行和另一个在不同网站上找到的组合。
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true \
-dColorImageResolution=150 -dNOPAUSE  -dBATCH -sOutputFile=output.pdf input.pdf

我的每一页都是一份文件的彩色扫描。这个命令行将页面的分辨率降低到150dpi,将文件大小减半,而不会显著降低分辨率。在我的Nexus 7上,它看起来仍然很好,文本也很容易阅读。


你正在使用这个命令吗?如果你已经合并了上面发布的其他组合,请发布完整的命令。我有一个彩色图像 PDF 的问题,它不能正确地缩小。谢谢。 - Aqib Mumtaz

1
我今天测试了一下,发现不知何故Ghostscript(9.54.0)的-dPDFSETTINGS=/screen选项会在图像分辨率设置为70 dpi或更高时自动增加文件大小。如果将dpi值设置在70以下,它将运行得非常好,并且能够以显著较小的文件大小创建几乎屏幕质量的文档,同时保持所有基于矢量的字体完整无损。以下是我使用的命令行,真的能够大大压缩这些庞大的PDF文件。
gswin64.exe -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -dDownsampleColorImages=true -dColorImageResolution=69 -dColorImageDownsampleType=/Bicubic -dAutoFilterColorImages=false -sOutputFile=YourOutputFile YourInputFile.pdf

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