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



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

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

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

命令行

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

如果您正在寻找免费(如"自由"(软件,Ghostscript 肯定是您的最佳选择。但是,它并不总是易于使用 - 它的一些(非常强大的(处理选项不容易找到文档。

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

  • 如何在pdf文件中对图像进行缩减采样?

基本上,它告诉您如何将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,首次引入它,默认情况下没有使用它。

您可以通过从PDF转换为Postscript,然后使用转换为PDF来获得良好的结果

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,但请注意它会剥离某些功能(例如超链接(。

这对

我有用

将您的 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/

你会失去质量,但如果这不是问题,那么ImageMagick的convert可能会有所帮助:

convert original.pdf reduced.pdf

请注意,它并不总是有效:我曾经使用此命令将 126 MB 文件转换为 14 MB 文件,但另一次它将 350 Ko 文件的大小增加了一倍。

无论如何,值得一试...

如评论中所述,当然在基于矢量的 PDF 上应用此命令是没有意义的,它只对光栅化图像有用。

另请参阅这篇文章以获取相关选项。

Ghostscript附带ps2pdf14实用程序,可用于优化PDF文件,但在某些情况下,"优化"文件的大小可能大于原始文件。

对于大小

主要是由于嵌入图像(pdfimages -list是您的朋友(,通常是扫描文档的PDF,我建议使用ocrmypdf,它非常擅长优化,可选的OCR层作为奖励。

这是我

的解决方案,它确实使用Ghostscript 9.54.0创建小型PDF文件。 https://stackoverflow.com/a/76583026/1856757

相关内容

最新更新