优化 PDF 文件(使用 Ghostscript 或其他)

新手上路,请多包涵

如果您想优化 PDF 文件并减小文件大小,Ghostscript 是最佳选择吗?

我需要存储大量的 PDF 文件,因此我需要尽可能优化和减小文件大小

有人对 Ghostscript 和/或其他有任何经验吗?

命令行

exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);

原文由 clarkk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

如果您正在寻找免费(如“libre”)软件,Ghostscript 无疑是您的最佳选择。然而,它并不总是很容易使用——它的一些(非常强大的)处理选项不容易找到文档。

看看这个答案,它解释了如何对图像分辨率下采样执行比通用 -dPDFSETTINGS=/screen 所做的更详细的控制(它定义了一些整体默认值,您可能想要覆盖):

基本上,它告诉你如何让 Ghostscript 将所有图像下采样到 72dpi 的分辨率(这个值是 -dPDFSETTINGS=/screen 使用的——你可能想要更低):

 -dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \

如果您想尝试 Ghostscript 是否也能够“取消嵌入”所使用的字体(有时有效,有时无效 - 取决于嵌入字体的复杂性以及所 使用的字体类型),您可以尝试将以下内容添加到您的 gs 命令中:

 gs \
  -o output.pdf \
   [...other options...] \
  -dEmbedAllFonts=false \
  -dSubsetFonts=true \
  -dConvertCMYKImagesToRGB=true \
  -dCompressFonts=true \
  -c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \
  -c ".setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Arial]>> setdistillerparams" \
  -f input.pdf

注意: 请注意,图像分辨率下采样肯定会降低质量(不可逆),并且反嵌入字体将使显示和打印 PDF 变得困难或不可能,除非机器上安装了相同的字体….


更新

我在原始答案中忽略的一个选项是添加

-dDetectDuplicateImages=true

到命令行。此参数会导致 Ghostscript 尝试检测多次嵌入 PDF 中的任何图像。如果您将图像用作徽标或页面背景,并且 PDF 生成软件未针对这种情况进行优化,则可能会发生这种情况。这曾经是旧版本的 OpenOffice/LibreOffice 的情况(我测试了 LibreOffice 的最新版本 v4.3.5.2,它不再做这种愚蠢的事情)。

如果您在 pdftk 的帮助下连接 PDF 文件,也会发生这种情况。为了向您展示效果以及如何发现它,让我们看一个示例 PDF 文件:

 pdfinfo p1.pdf

 Producer:       libtiff / tiff2pdf - 20120922
 CreationDate:   Tue Jan  6 19:36:34 2015
 ModDate:        Tue Jan  6 19:36:34 2015
 Tagged:         no
 UserProperties: no
 Suspects:       no
 Form:           none
 JavaScript:     no
 Pages:          1
 Encrypted:      no
 Page size:      595 x 842 pts (A4)
 Page rot:       0
 File size:      20983 bytes
 Optimized:      no
 PDF version:    1.1

Poppler 的 pdfimages 实用程序的最新版本增加了对 -list 参数的支持,该参数可以列出 PDF 文件中包含的所有图像:

 pdfimages -list p1.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image    423   600   rgb    3   8 jpeg     no     7  0    52    52 19.2K 2.6%

此示例 PDF 是一个 1 页的文档,其中包含一个使用 JPEG 压缩进行压缩的图像,其宽度为 423 像素,高度为 600 像素,并且在页面上以 52 PPI 的分辨率呈现。

如果我们在 pdftk 的帮助下连接该文件的 3 个副本,如下所示:

 pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf

然后结果通过 pdfimages -list 显示这些图像属性:

 pdfimages -list p3.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no     4  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no     8  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    12  0    52    52 19.2K 2.6%

这表明现在有 3 个相同的 PDF 对象(ID 为 4、8 和 12)嵌入在 p3.pdf 中。 p3.pdf 由3页组成:

 pdfinfo p3.pdf | grep Pages:

 Pages:          3

通过用参考替换重复的图像来优化 PDF

现在我们可以借助 Ghostscript 应用上述优化

 gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf

检查:

  pdfimages -list p3-optim.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%

每页仍然列出一个图像 - 但 PDF 对象 ID 现在始终相同:10。

  ls -ltrh p1.pdf p3.pdf p3-optim.pdf

   -rw-r--r--@ 1 kp  staff    20K Jan  6 19:36 p1.pdf
   -rw-r--r--  1 kp  staff    60K Jan  6 19:37 p3.pdf
   -rw-r--r--  1 kp  staff    16K Jan  6 19:40 p3-optim.pdf

如您所见,使用 pdftk 进行的“哑”连接将原始文件大小增加到原始文件的三倍。 Ghostscript 的优化使其大幅下降。

最新版本的 Ghostscript 甚至可能默认应用 -dDetectDuplicateImages(AFAIR,v9.02,第一次引入,默认没有使用。)

原文由 Kurt Pfeifle 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以通过将 PDF 转换为 Postscript,然后使用

pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf

参数 -dPDFSETTINGS 的值定义了生成的 PDF 中图像的质量。 Options are, from low to high quality: /screen , /default , /ebook , /printer , /prepress , see http://milan.kupcevic.net/ghostscript-ps-pdf/ 供参考。

Postscript 文件可能会变得非常大,但结果是值得的。我从 60 MB PDF 变成了 140 MB Postscript 文件,但最终得到了 1.1 MB 优化的 PDF。

原文由 Martijn de Milliano 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏