如果要优化PDF文件并减小文件大小,Ghostscript是最好的选择吗?
我需要存储大量PDF文件,因此我需要尽可能地优化和减小文件大小
是否有人对Ghostscript和/或其他有任何经验?
exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
如果您正在寻找免费(如“自由”)软件,那么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,并且不再做这种愚蠢的事情)。
如果在的帮助下合并PDF文件,也会发生这种情况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
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的分辨率进行渲染。
如果我们在这样的帮助下连接此文件的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的优化使它大大减少了。
-dDetectDuplicateImages
默认情况下,最新版本的Ghostscript甚至可以应用。 (首次引入该功能的AFAIR
v9.02,默认情况下未使用。)
我现在试图修改一个只有文本内容的PDF文件。当我使用 谢谢
问题内容: 在我的应用程序中,我的资产文件夹中存储了一些pdf文件。我看过用于打开pdf页面的库,但我认为Quickoffice之类的应用比我所见的库更能显示pdf。因此,我希望使用显示pdf ,如下所示: 但是,这是不可能的,因为不允许第三方应用访问我程序包中的文件。因此,我需要将文件复制到外部存储并将该文件提供给意图。 这使我想到了一个问题:我的pdf很大,因此我认为将它们存储两次(一次在我的
输入:带有嵌入式字体的(如14)PDF/A-1b文件列表 处理:与ApachePDFBox进行简单合并 结果:1个PDF/A-1b文件,文件大小较大(太大)。(它几乎是所有源文件大小的总和)。 问题:有没有办法减少生成的PDF文件的大小 想法:删除多余的嵌入式字体。但是怎么做呢?这是正确的方法吗? 不幸的是,下面的代码没有完成这项工作,而是突出了明显的问题。 代码会产生这样的输出: 任何感激的帮助
注意:我更喜欢如何处理和提出这些类型的解决方案的指南,而不是解决方案本身。 我的系统中有一个非常关键的性能函数,在特定上下文中显示为头号分析热点。它正在进行k-means迭代(已经使用并行处理每个工作线程中的点子范围的多线程)。 处理这段代码所需的任何时间节省都非常重要,所以我经常在这段代码上做很多事情。例如,可能值得将质心循环放在外部,并针对给定质心并行遍历点。这里的簇点数量以百万计,而质心的数
问题内容: 输入 :包含嵌入式字体的(例如14个)PDF / A-1b文件列表。 处理 :与Apache PDFBOX进行简单合并。 结果 :1个PDF / A-1b文件,文件大小太大(太大)。(这几乎是所有源文件大小的总和)。 问题 :是否可以减小生成的PDF的文件大小? 想法 :删除多余的嵌入式字体。但是如何?这是正确的做法吗? 不幸的是,以下代码无法完成任务,但突出了明显的问题。 该代码产生
我想把一个转换成一个文件。我尝试了一些方法,但这似乎是最好的方法(如果我错了,请纠正我)。我见过这个SO问题,但它对我不起作用——它和这个一样: 它没有给我一个错误,但我找不到任何Word文档,PDF仍然存在。。。 你知道如何解决这个问题,或者可以建议任何其他方法将转换成文件吗?