首页 > 解决方案 > 操作后压缩 PDF

问题描述

我有以下问题:

我从京瓷扫描仪设备接收到各种扫描的 PDF 文件。

我必须自动操作这些 PDF 文件,以便:

  1. 从文本标记中删除颜色
  2. 将 PDF 转换为灰度
  3. 放入我们的 DMS

我正在使用 Bash 脚本来完成这项工作。

为了删除文本标记颜色并转换为灰度,我使用 Imagemagick:

convert -density 150 INPUT.pdf \
-channel rgba \
-alpha set \
-fuzz 15% \
-fill white \
-opaque 'rgb(255,200,195)' \
-opaque 'rgb(255,253,177)' \
-opaque 'rgb(255,155,240)' \
-opaque 'rgb(255,91,193)' \
-colorspace gray OUTPUT-convert.pdf

生成的图像非常好,但 PDF 的大小很大:

原始:365K 转换:1.358K

所以我找到了一个 ghostscript 命令来完成这项工作并减小文件大小:

gs -dSAFER -dBATCH -dNOPAUSE -dNOCACHE -dCompatibilityLevel=1.4 \
-sDEVICE=pdfwrite   \
-sColorConversionStrategy=/LeaveColorUnchanged \
-dPDFSETTINGS=/ebook \
-sOutputFile=OUTPUT-ghostscript.pdf OUTPUT-convert.pdf

现在文件大小为:

原始:365K 转换:1.358K (OUTPUT-convert.pdf) Ghostscript:500K (OUTPUT-ghostscript.pdf)

我无法弄清楚为什么 PDF 处理后的大小(从彩色到灰度)高于原始文档。密度 (150 dpi) 是原始文档的分辨率。

当我在 Windows 上通过 Adob​​e Acrobat 放置转换后的 PDF(1.358K)并重新创建 PDF 时,大小为 213K。我没有质量损失。如何在 linux 下使用 bash 脚本实现这一点?

任何帮助表示赞赏!

以下是 PDF 文件示例的链接:

http://62.75.158.162/download/yKLu3fkbLy7MgkczDrKdG6osHdXh3jvy/

标签: linuximagemagickpdf-generationghostscriptimagemagick-convert

解决方案


在没有看到示例文件的情况下,真的不可能发表太多评论,以确定每个阶段发生了什么。

但是,我非常怀疑您“质量下降”,只是在屏幕分辨率下,您无法分辨。您的原始 PDF 文件是使用 ImageMagick 创建的,分辨率为 150 dpi。很可能图像未压缩地存储在 PDF 文件中,这就是它很大的原因。

当您通过 Ghostscript 运行该 PDF 文件时,有两种效果。首先,您使用了 PDFSETTINGS 固定的作业配置集。这(在许多其他事情中)将灰色图像下采样到 150 dpi 的分辨率(对你来说幸运的是,没有效果)。它还使用 JPEG 压缩来压缩图像数据。

现在我不知道原始 PDF 文件中有什么,但如果那里的数据是使用 JPEG 压缩的,看起来很可能,那么你会双重应用 JPEG 量化。这是一个有损过程,会导致质量下降。

由于您正在更改原始图像数据(以更改颜色),因此您无法选择解压缩图像数据。但是,为了保持质量,您不应再次使用 JPEG 压缩,而应使用 Flate 压缩。压缩比不会那么好,但它会保持质量不变。为此,您需要使用 distillerparams 指定 GrayImageFilter,您不能为此使用 PDFSETTINGS。

我无法想象 Acrobat 为进一步减小文件大小做了什么(而且您还没有说过如何“重新创建 PDF 文件”),但我想它涉及进一步降低图像质量。如果不这样做,很难看出它如何能节省 50% 的文件大小。也可能是(如 Ghostscript)JPEG 压缩灰度数据,但使用更激进的 JPEG 参数集(当然会导致更多质量损失)。

如果您发布了原始、Ghostscript 输出和 Acrobat 输出的示例,我可能会告诉您更多信息,但不是从这里。

值得一提的是,Ghostscript 中有一个新功能(需要 9.23 或更高版本),它允许您创建仅包含图像的 PDF 文件,并选择颜色模型。您可以使用以下方式通过 Ghostscript 运行原始 PDF 文件:

gs -sDEVICE=pdfimage8 -r150 -sOutputFile=gs.pdf

这将生成一个非常小的 PDF 文件,其中原始输入已被渲染为灰度图像(150 dpi),并且该图像被包装为 PDF 文件。我不知道这是否对你更有效。

后来编辑

是的,这和我预期的差不多。

原始文件具有似乎标记为 JPEG 压缩伪像的内容(文本周围的所有矩形“斑点”)。显然,在没有看到原始文档的情况下,我无法判断这是否是因为原始文档是打印到纸上的 JPEG,或者是扫描仪引入了伪影,或者(更有可能)任何应用程序将扫描的图像转换为 PDF。检查存储在 PDF 文件中的图像,我发现它确实是 JPEG 图像。

尽管如此,原始图像(在我看来)确实非常嘈杂。

现在,'convert' 的输出可以说比原来的输出稍微好一点(在易读性方面)。我认为这与您的转换命令行有关,不能确定。在这种情况下,图像不是JPEG,它使用 RunLength 编码压缩,当然是无损的。它作为一种压缩方法也效率较低,因此图像更大。由于 ImageMagick 最为人所知的原因,它还对图像数据应用了软掩码。所以现在每页有两张图片,而不是只有一张。它比原来的大一点也不奇怪!

我怀疑软掩码是由于您的命令行(包括 RGBA)造成的。我假设这会产生一个 alpha 通道,并且 PDF 不支持简单的 alpha 通道混合,它自己的透明度模型要复杂得多。所以我有点怀疑你实际上是在让输出文件比它需要的大。恐怕我无法为您提供 ImageMagick 的帮助,我对此一无所知,但摆脱第二张图像会有很大帮助。

请注意,您的原始文件和 ImageMagick 的输出基本上都是未压缩的(就 PDF 文件的“结构”而言)。

然后我们来看看 Ghostscript 制作的 PDF。PDF 文件的“结构”本身是压缩的,因此具有小尺寸的优势。这些图像都是 JPEG 压缩的,提供额外的压缩,但以质量为代价。多次应用 JPEG 量化总是会降低质量。通过简单地将“转换”的输出与 Ghostscript 的输出进行比较,我可以很容易地看到质量下降。

现在我们来到 Acrobat 输出。C将其与其他文件进行比较,它显示出最差的质量。JPEG 伪影在显示的图像中非常清晰可见。在这种情况下,图像和软掩码都已使用 JPEG2000 压缩方案进行压缩,这是一种比 JPEG 更好的压缩方式。但是,看起来将其应用于已经为 JPEG 量化的数据会产生非常差的质量结果。或者至少,将其应用于软屏蔽 JPEG 图像可以:-)

JPEG2000 的主要问题是它受专利保护。虽然解码器可以免版税编写,但要编写编码器,您必须从(许多)专利持有者那里获得专利技术的许可,这是一个昂贵的过程。

所以 AGPL 版本的 Ghostscript 不包含 JPEG2000 解码器,因此无法写入 JPEG2000 图像。

显然,您可以使用 Acrobat 的副本以 JPEG2000 压缩重写您的 PDF 文件,就像您在此处所做的那样。

假设您想避免这样做,那么我的建议是调查为什么 convert 会生成应用了软蒙版的图像。我强烈怀疑这是由于使用 rgba 而不是 rgb。

避免创建第二个(软蒙版)图像(我相信)会显着减小“转换”生成的 PDF 文件的大小。通过 Ghostscript 的 pdfwrite 设备运行它并为 GrayImageFilter 指定 /FlateEncode,您至少可以获得一些额外的好处,而不会降低质量。这将生成一个 PDF 文件,其中 PDF 家具被压缩,并且更好的压缩方案应用于图像数据。

您也可以直接保留 Ghostscript 行,质量下降可能足以让您忍受。


推荐阅读