无损压缩从 PostScript 生成的 PDF

Posted

技术标签:

【中文标题】无损压缩从 PostScript 生成的 PDF【英文标题】:Losslessly Compress PDF Generated from PostScript 【发布时间】:2017-07-06 02:07:26 【问题描述】:

我正在生成多个 EPS 文件,其中包含多个不一定有效编码的 PostScript 绘图命令。 this question 的回答中的第一个更新描述了类似的低效率。

我的每个 EPS 文件大约为 18 MB,生成的 PDF 文件大约为 3 MB。我正在使用epstopdf 生成 PDF 文件,默认情况下启用某种压缩。

对于如何在不改变质量的情况下进一步减小生成的 PDF 文件大小(例如,栅格化矢量图形)有什么建议吗?

我尝试将坐标的精度从小数点后 8 位降低到 3。这将 EPS 文件大小减少到大约 14 MB,但与直觉相反,PDF 文件大小略有增加。

更新 1:EPS 文件包含以下针对不同坐标和颜色的示例代码多次出现。

newpath
1 setlinejoin
1 setlinecap
<<
/BBox [322      384.0417      615.0087      651.9958]
/Domain [322      384.0417      615.0087      651.9958]
/ShadingType 6
/ColorSpace [/DeviceRGB]
/DataSource
[
0
   350.00000000    651.99583594
   336.00000000    645.75890880
   336.00000000    645.75890880
   322.00000000    639.52198166
   339.17140372    627.26533984
   339.17140372    627.26533984
   356.34280743    615.00869803
   370.19224806    621.16169097
   370.19224806    621.16169097
   384.04168868    627.31468392
   367.02084434    639.65525993
   367.02084434    639.65525993
0.23047     0.29688        0.75 
0.23047     0.29688        0.75 
0.41081     0.54141     0.93366 
0.41112     0.54178     0.93388 
]
>>
gsave
322      615.0087      62.04169      36.98714 rectclip
shfill
grestore

更新 2:通过使用pdftocairo,然后使用gs -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dDetectDuplicateImages=true -sOutputFile=out.pdf in_.pdf,我能够将 PDF 文件大小减少约 15%。

【问题讨论】:

【参考方案1】:

PostScript 是一种编程语言,而 PDF 不是,因此通常您实际上可以创建比生成的 PDF 文件更小的 PostScript 程序。

您在 EPS 程序中提到的“低效率”以及输入数字的精度与 PDF 文件的大小完全无关。 PDF 中的运算符与 PostScript 中的运算符名称不同,因此 PostScript 中的“moveto”在生成的 PDF 文件中不会简单地音译为“moveto”。输出 PDF 文件中数字的精度与输入中数字的精度无关。

此外,PostScript 解释器通常使用固定精度算术(例如 Ghostscript 使用 24:8),因此(例如)输入上的 1.5 可能不会在输出上产生 1.5,而是可能变成 1.49999999。

因此,基本上,这样做的结果是,没有人可以在没有看到它们的情况下说出为什么您的 PDF 文件会这么大。我个人建议将尺寸缩小 6:1 是相当合理的。如果您在某个地方发布了一个具有代表性的示例,那么可能有人会看到它并可能会提供一些建议,但如果没有看到内容,这实际上是不可能的。

NB 渲染内容很可能增加 PDF 文件的大小,除非您以非常低的分辨率渲染。

编辑

提供的示例只是一个着色字典,PDF 文件将包含几乎完全相同的特定结构的数据。它已经和你想象的一样紧凑,我非常怀疑这是占用 18MB 源的东西,那将是大量的阴影。没有现实的方法可以使它变小,并且将其渲染为位图(即使在非常低的分辨率下)实际上会使它变大。

EPS 完全有可能包含位图预览之类的内容,当然,在创建 PDF 时会删除这些内容。它也可能(取决于创建应用程序)包含存储为 cmets 的原始文档,在创建 PDF 文件时也将被删除。如果没有看到原始 EPS,实际上不可能提出太多建议。

恐怕发布文件的一小部分并没有真正的帮助。

【讨论】:

感谢您的信息。我更新了原始问题以显示一些示例代码。 我通过简单地编写命令从头开始生成 EPS 文件。不包含 cmets 或预览。实际的 EPS 文件仅包含大约 10,000 个着色不同四边形的实例,使用我在问题中包含的语法类型。 那么在这种情况下,生成的 PDF 将尽可能紧凑。

以上是关于无损压缩从 PostScript 生成的 PDF的主要内容,如果未能解决你的问题,请参考以下文章

无损压缩算法历史

ImageMagick:PNG的无损最大压缩?

加速度计信号的无损压缩

图像的基本有损压缩和无损压缩及解压

当质量设置为 100 时,JPEG 是无损的吗?

Lepton 无损压缩原理及性能分析