如果您想优化 PDF 文件并减小文件大小,Ghostscript 是最佳选择吗?
我需要存储大量的 PDF 文件,因此我需要尽可能优化和减小文件大小
有人对 Ghostscript 和/或其他有任何经验吗?
命令行
exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
如果您想优化 PDF 文件并减小文件大小,Ghostscript 是最佳选择吗?
我需要存储大量的 PDF 文件,因此我需要尽可能优化和减小文件大小
有人对 Ghostscript 和/或其他有任何经验吗?
exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
如果您正在寻找免费(如“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 文件:
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
Popplerpdfimages
实用程序的最新版本添加了对-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 的分辨率呈现。
如果我们在这样的帮助下连接该文件的 3 个副本pdftk
:
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%
这表明p3.pdf
现在嵌入了 3 个相同的 PDF 对象(ID 为 4、8 和 12)。p3.pdf
由 3 页组成:
pdfinfo p3.pdf | grep Pages:
Pages: 3
现在我们可以借助 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,第一次引入,默认没有使用。)
您可以通过将 PDF 转换为 Postscript,然后使用
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf
参数的值-dPDFSETTINGS
定义了生成的 PDF 中图像的质量。选项是,从低质量到高质量:/screen
, /default
, /ebook
, /printer
, /prepress
, 请参阅http://milan.kupcevic.net/ghostscript-ps-pdf/以获取参考。
Postscript 文件可能会变得非常大,但结果是值得的。我从 60 MB PDF 变成了 140 MB Postscript 文件,但最终得到了 1.1 MB 优化的 PDF。
我将 Ghostscript 与从此处获取的以下选项一起使用。
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
您可能会发现pdftocairo
(来自Poppler)可以制作更小的 PDF,但要注意它会剥离一些功能(例如超链接)。
你会失去质量,但如果这不是问题,那么 ImageMagickconvert
可能会很有帮助:
convert original.pdf reduced.pdf
请注意,它并不总是有效:我曾经使用此命令将 126 MB 文件转换为 14 MB 文件,但另一次它将 350 Ko 文件的大小增加了一倍。
不管怎样,值得一试……</p>
正如评论中提到的,在基于矢量的 PDF 上应用这个命令当然没有意义,它只对光栅化图像有用。
另请参阅此帖子以获取相关选项。
这对我有用
将您的 PDF 转换为 PS(这会创建一个大文件
pdf2ps large.pdf very_large.ps
将新 PS 转换回 PDF
ps2pdf very_large.ps small.pdf
资料来源: https ://pandemoniumillusion.wordpress.com/2008/05/07/compress-a-pdf-with-pdftk/
Ghostscript 附带ps2pdf14
可用于优化 PDF 文件的实用程序,但在某些情况下,“优化”文件的大小可能比原始文件大。