PDFTK 压缩选项

118

我使用 pdftk 命令行压缩 PDF 文件,命令如下:

pdftk file1.pdf output file2.pdf compress

我的文件大小减小了,看来它起到了作用。

是否有[选项]可以更改压缩方式???

或者其他压缩文件的解决方案?这是因为一些图形具有许多点而导致文件很重。是否有一种方法可以将这些图形转换为JPG格式,并适应压缩?


2
根据我的经验,这取决于你的pdf文件中包含了什么。如果它是一个有许多点的图形,最好的解决方案是将该图形转换为png格式,并将其包含在pdf文件中。 - RockScience
13个回答

145

我遇到了同样的问题,并找到了两个不同的解决方案(有关更多详细信息,请参见此线程)。两种方法都显著减小了未压缩PDF的大小。

  • 像素化(有损):

    convert input.pdf -compress Zip output.pdf
    
  • 非像素化(无损,但可能显示略有不同):

  • gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=output.pdf input.pdf
    

    编辑:我刚刚发现了另一个选项(用于无损压缩),避免了恶劣的 gs 命令。 qpdf 是一个不错的工具,可以转换 PDF 文件(压缩/解压缩、加密/解密),而且比 gs 命令快得多:

    qpdf --linearize input.pdf output.pdf
    

3
太棒了!Awesome.gs对我很有效,将一个4MB的文件转换成了339K。虽然有一些质量损失,但已经能够满足我的需求了。 - Sridhar Sarnobat
38
为了获得更好的质量,您可以使用“打印机”PDF设置:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf - imriss
11
为了调整PDF文件的质量(因而也影响大小),请改变PDFSETTINGS的值。详情请参见http://ghostscript.com/doc/current/Ps2pdf.htm#Options。 - 1in9ui5t
7
请注意,答案中的 gs 命令并不是完全无损的,因为它会降低嵌入的 JPG 图像的分辨率和质量。但就文本而言,它是无损的,保留为文本,而 convert 命令则将其转换为光栅图形。 - tanius
19
将设置选项-dPDFSETTINGS=设置为/ebook对我来说产生了非常好的输出结果:当然,它被压缩了,一些jpg伪像是可见的,但在一个合理的大小下完全可读。谢谢! - Joël
显示剩余7条评论

47

尝试使用tiff2pdf将400ppi的Tiffs(大部分为8位,少量为24位)使用PackBits压缩,并使用Zip/Deflate进行压缩来压缩PDF。这些方法中我遇到的一个问题是:以上所有方法都没有保留目录(TOC),而我在Acrobat Pro X中手动创建了它。甚至连gs的推荐ebook设置也是如此。当然,我可以打开保留目录的原始文件副本并执行Replace pages,但不幸的是,这些方法起初都做得不够好。要么它们将大小减小得无法接受的像素化质量,要么它们根本没有减小大小,在某些情况下甚至会增加大小,尽管存在质量损失。

pdftk compress

no change in size
bookmarks TOC are gone

gs screen

takes a ridiculously long time and 100% CPU
errors:
    sfopen: gs_parse_file_name failed.                                 ? 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->10.2MB hideously pixellated
bookmarks TOC are gone

gs printer

takes a ridiculously long time and 100% CPU
no errors
74.8MB-->66.1MB
light blue background on pages 1-4
bookmarks TOC are gone

gs电子书:

errors:
    sfopen: gs_parse_file_name failed.
      ./base/gsicc_manage.c:1050: gsicc_open_search(): Could not find default_rgb.ic 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->32.2MB
badly pixellated
bookmarks TOC are gone

qpdf --linearize:

very fast, a few seconds
no size change
bookmarks TOC are gone

pdf2ps

took very long time
output_pdf2ps.ps 74.8MB-->331.6MB

ps2pdf

pretty fast
74.8MB-->79MB
very slightly degraded with sl. bluish background
bookmarks TOC are gone

3
这是非常有价值的研究(谢谢!),但它并不是一个答案,让我一度想要点个踩。 - ndemou
5
这不是回答吗? - hmj6jmh

40

这个过程运行得相当不错。

pdf2ps large.pdf very_large.ps

ps2pdf very_large.ps small.pdf

试一试吧。


12
这不是一个通用的解决方案。在许多情况下,生成的PDF文件会更大。 - rotskoff
5
这对我来说是提到的所有解决方案中最有效的。一些大图像的大小从23MB降至1.4MB,且质量损失远远最少。 - AerandiR
1
@rotskoff 可能没有通用的解决方案,因为有不同类型的文档。但我理解你的意思。拥有一款能够自动找到最佳解决方案的软件会很不错。 - tiktak
1
如此方法的另一个缺点在此提及是,它会破坏文档内的URL链接。 - ptomato
1
我尝试了这个页面上提到的几种解决方案,其中这个是最好的,质量也最好。从22.1MB的PDF转换成了220.2MB的PS,最终得到了一个3.8MB的PDF,且几乎没有感知到质量损失。 - Brandon
显示剩余4条评论

34
如果文件大小仍然太大,可以使用ps2pdf来降低生成的pdf文件的分辨率:
pdf2ps input.pdf tmp.ps
ps2pdf -dPDFSETTINGS=/screen -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic tmp.ps output.pdf

调整-dColorImageResolution选项的值以获得符合您需求的结果(该值描述了图像的分辨率,单位为DPI)。如果您的输入文件是灰度的,可以通过将Color替换为Gray或在上述命令中同时使用这两个选项来帮助优化。通过将-dPDFSETTINGS选项更改为/default/printer也可以进行进一步的微调。有关所有可能选项的说明,请参阅ps2pdf手册


1
谢谢您的提示。使用-dPDFSETTINGS,我可以减小扫描PDF文件的大小。 - eshwar
2
谢谢。我认为并没有适用于每个人使用情况的通用解决方案,但我尝试了这个线程上几乎所有的解决方案,这是唯一一个对我有效的!能够“调整”dColorImageResolution参数非常关键——必须使文档大小足够小以便该政府网站接受,但又足够大以便清晰可读。感谢 Uncle Sam 给我们带来的又一个痛苦的障碍 :) - alliedtoasters
1
谢谢!这将大小缩小了10倍,没有看到图像损失 :-) gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic -sOutputFile=output.pdf input.pdf - CeDeROM

7

单行的pdf2ps选项(由Lee提供)实际上增加了pdf文件的大小。然而,使用两步操作效果更好。而且可以使用重定向从&到标准输入/输出和管道结合成一个单一的命令:

pdf2ps large.pdf - | ps2pdf - small.pdf

将由xsane生成的PDF文件从18 Mo降至630 ko!

链接会丢失,但对于当前的例子,这不是问题......并且这也是达到预期结果最简单的方法。


2
你可以尝试使用ps2pdf,请参考我的评论中对@Lee答案的回复。 - myrdd

5

pdf2ps large.pdf small.pdf 就足够了,不需要分成两步

pdf2ps large.pdf very_large.ps 
ps2pdf very_large.ps small.pdf

然而,ps2pdf large.pdf small.pdf 是更好的选择。

  • ps2pdf 更快
  • 如果没有指定额外参数,pdf2ps 有时会产生更大的文件。

你在哪里找到这个选项的?它是某个最近版本的功能吗?对我来说它没有起作用。尽管我将输出文件命名为 out.pdf,但它变成了一个 PS 文件(mimetype out.pdf 显示 out.pdf: application/postscript)。 - myrdd
很奇怪。你的 pdf2ps 是否与这个不同? - myrdd
哦,ps2pdf 对我来说可以将 pdf 转换为 pdf。你可能把 ps2pdfpdf2ps 搞混了吧? - myrdd
如果您能尝试一下ps2pdf是否对您有所帮助,那就太好了(可以通过比较哈希值或使用“diffpdf”进行比较)。在我看来,ps2pdf应该总是有效的,因为它使用pdfwrite驱动程序,就像得票最高的gs答案一样。- 我建议您在回答中指出ps2pdf也可能有效(甚至在更多情况下可能有效)。 (如果您这样做,我会给您+1的;)。) - myrdd
1
@myrdd 是的,我进行了测试。ps2pdf 更好。 - wsdzbm
显示剩余6条评论

3

nullglob建议下,我尝试了gpdf,但发现只需使用cups-pdf打印机即可获得相同的压缩结果(将一个约900mb的文件压缩至约30mb)。如果您已经查看文档并且只需要压缩一两个文档,则这可能更容易/更受欢迎。

在Ubuntu 12.04中,您可以通过以下方式安装:

sudo apt-get install cups-pdf

安装后,请确保在“系统工具”>“管理”>“打印”中检查,右键单击“PDF”,并将其设置为“启用”。
默认情况下,输出保存在您的主目录中名为“PDF”的文件夹中。

1
我来到这里是因为cups-pdf没有压缩我的PDF文件,反而使它变得大了5倍 :-) - CeDeROM
也许这是你使用的版本有问题,因为我猜想我写这篇文章时使用的是不同的版本。 - ryanjdillon
它为我将一个182 MB的PDF转换成了一个237 MB的PDF。不幸的是,似乎没有任何相关的选项可以设置。 - undefined

2
我知道这篇文章已经有很多回复了,但是我也遇到了同样的问题,那就是想要压缩一个用PDKTK创建的PDF文件。正如我在评论中所说,gs命令不适合我的情况。
而且,正如评论中已经说过的,使用convert命令得到的结果对于一些人来说太过降低质量了。但实际上并非如此。"convert"命令可以生成一个正确的PDF文件,并且大小相当小。
使用以下命令,我的PDF文件压缩比为74%,视觉效果正确: convert -density 125 original_file.pdf -quality 100 -compress Zip compress_file.pdf 使用以下命令,我的PDF文件压缩比为81%,视觉效果略有下降: convert -density 100 original_file.pdf -quality 100 -compress Zip compress_file.pdf

这是一个非常糟糕的选择,因为您删除了所有矢量图形,而不仅仅是嵌入式图形。您实际上将页面转换为压缩位图。这意味着清晰的文本已经消失了,您可能只是在收集JPEG。 - oligofren
也许在你的情况下这不是一个好的选择,但它解决了我的问题。当然我会在这里发布它以便帮助他人。这不像粘贴JPEG文件那样简单。 - Juan

1

在尝试了这里列出的所有答案后,我为具有大量图形的PDF获得的最佳结果是

pdftocairo input.pdf output.pdf -pdf

我通过在Gnome中用Evince打开PDF文件,然后打印到文件来发现这一点。与所有其他答案相比,这导致了更好的文件压缩和更好的文件质量对于我的PDF文件。这种方式打印文件时似乎使用了cairo图形库:运行pdfinfo命令可以查看生成文件的信息:

生成器: cairo 1.16.0 (https://cairographics.org)


我用一个10MB的文件试过了,结果它变成了13MB。 - Alf Pascu
pdftocairo -pdf -paper A4 input.pdf output.pdf - acpmasquerade

0

Okular的PDF打印功能

我刚刚使用Okular的PDF打印功能,将一个由Keynote生成的140MB PDF文件转换成了2.8MB。虽然文本被转换为光栅图像,过度放大会显示像素,但图片保持相当清晰,适用于消息应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接