如何知道 PDF 文件是否被压缩并(解)压缩它

Tim*_*Tim 22 pdf

我刚刚了解到可以压缩 PDF 文件以减少其磁盘大小。

  1. 我想知道如何知道 PDF 文件是否已经被压缩?
  2. 哪些应用程序/命令可用于压缩或解压缩 PDF 文件?

我的环境是 Linux Ubuntu 10.10。


一些尝试没有给出令人满意的结果:

  1. 以下是尝试的结果pdftk

    $ pdftk 3.pdf output 5.pdf uncompress 
    $ pdftk 3.pdf output 3comp.pdf compress 
    $ ls -l 3.pdf 3comp.pdf 5.pdf
    -rwxrwx--- 1 root plugdev  8652269 2011-07-30 12:27 3comp.pdf
    -rwxrwx--- 1 root plugdev  8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 16829828 2011-07-30 12:27 5.pdf
    
    Run Code Online (Sandbox Code Playgroud)

    文件的属性表明它们都没有优化。

  2. 转换为 ps 然后返回 pdf 的结果:

    $ pdf2ps 3.pdf 3.ps
    $ ps2pdf 3.ps 3c.pdf
    $ ls -l 3.pdf 3.ps 3c.pdf
    -rwxrwx--- 1 root plugdev   8808946 2011-07-30 13:14 3c.pdf
    -rwxrwx--- 1 root plugdev   8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 122375966 2011-07-30 13:14 3.ps
    
    Run Code Online (Sandbox Code Playgroud)

Phi*_*ath 39

简而言之:

要知道它是否已经压缩:

strings your.pdf | grep /Filter

要(解)压缩 PDF,请使用QPDF

qpdf --stream-data=compress your.pdf compressed.pdf
qpdf --stream-data=uncompress compressed.pdf uncompressed.pdf  
Run Code Online (Sandbox Code Playgroud)

解释:

pdf 文件中的“过滤器”关键字是所用压缩方法的指示符。他们之中有一些是:

CCITT G3/G4 – 用于单色图像
JPEG – 一种用于图像的有损算法
JPEG2000 – JPEG 的更现代替代品,也用于压缩图像
Flate – 用于压缩文本和图像
JBIG2 – 替代品单色图像的 CCITT 压缩
LZW – 用于压缩文本和图像,但被 Flate
RLE取代– 用于单色图像
ZIP – 用于灰度或彩色图像

(从这里复制)。

然而,鉴于 PDF 复杂的文件结构,大多数时候 PDF 的某些部分(或“流”)已经以某种方式被压缩(并且会在 grepping /Filter 时显示)而其他部分则不会,所以对于 PDF 是否被压缩的问题,没有 YES/NO 答案。
解决这个问题的一种方法是向-cgrep添加选项,它返回出现的次数,因此您可以相对了解它的压缩程度。例如,如果strings "large.pdf" | grep -c /Filter返回小于 10,则它是非常未压缩的。

另一个与 PDF 大小相关的属性是,它们是否已针对快速访问进行了优化,“优化”的 PDF 的大小更大,引用自维基百科

PDF 文件有两种布局——非线性(非“优化”)和线性(“优化”)。非线性 PDF 文件比线性 PDF 文件消耗更少的磁盘空间,但它们的访问速度较慢,因为组装文档页面所需的部分数据分散在整个 PDF 文件中。线性 PDF 文件(也称为“优化的”或“网络优化的”PDF 文件)的构造方式使它们能够在 Web 浏览器插件中读取,而无需等待整个文件下载,因为它们以一种方式写入磁盘线性(按页面顺序)方式。PDF 文件可以使用 Adob​​e Acrobat 软件或 QPDF 进行优化。

您可以使用pdfinfo your.pdf.


ulo*_*sEI 10

pdftk是一个对 PDF 文件进行一些操作的工具,比如压缩/解压:

$ pdftk test.pdf output compressed_test.pdf compress
Run Code Online (Sandbox Code Playgroud)