【问题标题】:Compress PDF after manipulation操作后压缩 PDF
【发布时间】:2018-10-05 14:12:21
【问题描述】:

我有以下问题:

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

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

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

感谢任何帮助!

这里是 PDF 文件示例的链接:

http://62.75.158.162/download/yKLu3fkbLy7MgkczDrKdG6osHdXh3jvy/

【问题讨论】:

  • Imagemagick 使用 ghostscript 处理 PDF。但两者都光栅化了pdf。如果然后将其转换为 PDF,那么您所做的就是将光栅图像放入矢量外壳中。这将不小于您使用 ghostscript 或 Imagemagick 阅读 PDF 时创建的光栅图像。
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。

标签: linux imagemagick pdf-generation ghostscript imagemagick-convert


【解决方案1】:

如果不查看示例文件,实际上不可能发表太多评论,以确定每个阶段发生了什么。

但是,我非常怀疑您“质量下降”,只是在屏幕分辨率下,您无法分辨。您的原始 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 线保持原样,质量下降可能足以让你忍受。

【讨论】:

  • 感谢您的回复!不幸的是,我们的系统只有 ghostscript 9.18 :-( 系统更新后我会试一试。
  • 我已经上传了 3 个示例文件:
  • 添加为 EDIT,因为太长,无法发表评论。
【解决方案2】:

如果你使用 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 替换为您的文件名。

【讨论】:

    【解决方案3】:

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

    您使用 -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
    


    根据需要调整质量值

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2016-10-07
      • 2010-12-19
      • 2012-10-09
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多