cla*_*rkk 49 linux pdf debian ghostscript
如果要优化PDF文件并减小文件大小,Ghostscript是最佳选择吗?
我需要存储很多PDF文件,因此我需要尽可能地优化和减小文件大小
有没有人有Ghostscript和/或其他的经验?
exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
Run Code Online (Sandbox Code Playgroud)
Kur*_*fle 76
如果您正在寻找免费(如'libre')软件,Ghostscript肯定是您的最佳选择.但是,它并不总是易于使用 - 它的一些(非常强大的)处理选项不容易找到记录.
看一下这个答案,它解释了如何对通用图像分辨率下采样执行更详细的控制-dPDFSETTINGS=/screen(定义一些总体默认值,您可能想要覆盖):
基本上,它告诉你如何让Ghostscript将所有图像下采样到72dpi的分辨率(这个值是-dPDFSETTINGS=/screen用的 - 你可能想要更低):
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \
Run Code Online (Sandbox Code Playgroud)
如果你想尝试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
Run Code Online (Sandbox Code Playgroud)
注意:请注意,下采样图像分辨率肯定会降低质量(不可逆转),并且嵌入字体会使显示和打印PDF变得困难或不可能,除非机器上安装了相同的字体....
我在原来的答案中忽略了一个选项是添加
-dDetectDuplicateImages=true
Run Code Online (Sandbox Code Playgroud)
到命令行.此参数使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
Run Code Online (Sandbox Code Playgroud)
最新版本的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%
Run Code Online (Sandbox Code Playgroud)
此示例PDF是一个1页的文档,其中包含一个图像,该图像使用JPEG压缩进行压缩,宽度为423像素,高度为600像素,并在页面上以52 PPI的分辨率呈现.
如果我们在这样的帮助下连接这个文件的3个副本pdftk:
pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf
Run Code Online (Sandbox Code Playgroud)
然后结果显示这些图像属性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%
Run Code Online (Sandbox Code Playgroud)
这表明p3.pdf现在嵌入了3个相同的PDF对象(ID为4,8和12).p3.pdf由3页组成:
pdfinfo p3.pdf | grep Pages:
Pages: 3
Run Code Online (Sandbox Code Playgroud)
现在我们可以在Ghostscript的帮助下应用上面提到的优化
gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf
Run Code Online (Sandbox Code Playgroud)
检查:
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%
Run Code Online (Sandbox Code Playgroud)
每页仍然列出一个图像 - 但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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,使用pdftk进行的"哑"连接将原始文件大小增加到原始文件大小的三倍.Ghostscript的优化使其大幅下降.
最新版本的Ghostscript甚至可以-dDetectDuplicateImages默认应用.(AFAIR,v9.02,它是第一次引入它,默认情况下不使用它.)
Mar*_*ano 28
您可以通过将PDF转换为Postscript,然后使用转换为PDF来获得良好的结果
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf
Run Code Online (Sandbox Code Playgroud)
argument的值-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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61675 次 |
| 最近记录: |