操作后压缩 PDF

Compress PDF after manipulation

我有以下问题:

我正在从京瓷扫描仪设备接收各种扫描的 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(输出-convert.pdf) Ghostscript:500K(输出-ghostscript.pdf)

我不明白为什么处理后的 PDF 的大小,从彩色到灰度,都比原始文档大。密度(150 dpi)是原文档的分辨率。

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

感谢任何帮助!

这是一个 link 例如 PDF 文件:

http://62.75.158.162/download/yKLu3fkbLy7MgkczDrKdG6osHdXh3jvy/

如果没有看到示例文件,就无法准确地确定每个阶段发生了什么。

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

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

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

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

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

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

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

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

这将生成一个非常小的 PDF 文件,其中原始输入已呈现为灰度图像(150 dpi),并将该图像打包为 PDF 文件。我不知道这是否更适合你。

稍后编辑

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

原始文件似乎有标记为 JPEG 压缩的伪像(所有矩形 'speckles' 环绕文本)。显然,在没有看到原始文档的情况下,我无法判断这是因为原始文档是打印到纸上的 JPEG,还是扫描仪引入了人工制品,或者(更有可能)任何应用程序将扫描图像转换为 PDF。检查存储在 PDF 文件中的图像,我发现它确实是 JPEG 图像。

然而,原始图像(在我看来)确实非常嘈杂。

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

我怀疑软蒙版是由于您的命令行包括 RGBA。我假设生成一个 alpha 通道,而 PDF 不支持简单的 alpha 通道混合,它自己的透明度模型 much 更复杂。所以我有点怀疑你实际上在这里使输出文件大于它需要的大小。恐怕我不能用 ImageMagick 帮助你,我对此一无所知,但摆脱第二张图片会有很大帮助。

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

接下来我们就来看看Ghostscript制作的PDF。 PDF 文件的 'structure' 本身是压缩的,具有体积小的优点。这些图像都是 JPEG 压缩的,提供了额外的压缩,但以质量为代价。多次应用 JPEG 量化 总是 会降低质量。通过简单地将 'convert' 的输出与 Ghostscript 的输出进行比较,我可以很容易地看到质量下降。

现在我们来看看 Acrobat 输出。 Ccomparing 它与其他文件它显示最差的质量。 JPEG 伪影在显示的图像中非常清晰可见。在这种情况下,图像和软蒙版均已使用 JPEG2000 压缩方案进行压缩,该压缩方案比 JPEG 压缩 'better'。但是,将其应用于已经针对 JPEG 进行量化的数据似乎会产生非常差的质量结果。或者至少,将它应用于软蒙版 JPEG 图像确实 :-)

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

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

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

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

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

您也可以让 Ghostscript 行保持原样,质量下降可能足以让您忍受。

如果您使用 ubuntu,您可以在命令行上尝试。结果令人印象深刻

安装 ghostscript,Ubuntu/Debian:

sudo apt-get install ghostscript

使用以下命令调整您的 pdf 大小:

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

将文件名 output.pdf 和 input.pdf 替换为您的文件名。

PDF 可以从矢量开始。但是一旦你将它读入 ImageMagick,它就会被光栅化。当写回 PDF 时,它只是将光栅图像嵌入矢量 PDF shell。所以它没有被重新矢量化。

您使用-density 150 增加了光栅化文件。标称密度为 72。所以就在那里增加了 4 倍,这刚好可以弥补尺寸的增加。我认为你说的增加是错误的。它可能应该是 Original: 365K Converted: 1.358M 而不是 Original: 365K Converted: 1.358K

此外,如果扫描的 PDF 是矢量中的光栅,则它可能具有有限的调色板形式颜色或简单的压缩 JPG 形式。您的光栅化已转换为 24 位颜色,并且通过处理增加了颜色。因此,即使是非压缩灰度,它也更大。

您可以按如下方式在 ImageMagick 中压缩输出 PDF,方法是将光栅图像写入压缩的 JPG 格式并通过管道传输到另一个转换以写入 PDF。

convert -density XXX input.pdf ... -colorspace gray -quality 50 JPG:- | convert - output.pdf


根据需要调整质量值