首页 > 解决方案 > 缩小pdf的ghostscript不再起作用

问题描述

这里的第一个问题。

所以我使用 ghostscript 命令来缩小我的 pdf,这产生了很好的结果(大小减少了大约 30-40%)。然而,上周的一天,它停止缩小它们,而是返回给我一个大小甚至更重的 pdf(大约 1% 或更少)。因此,我不知道发生了什么,因为该命令曾经可以正常工作,并且我能够轻松缩小一些 pdf ......

我会注意到,在我的 pdf 上使用 gs 时,它总是会返回有关 GlyphLessFont 中缺少某些字形的错误,但我认为这与我的问题无关(尽管如果您可以将我重定向到修复 glyphlessfont 将不胜感激) .

这是我使用的命令:

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

这也是正确缩小的 pdf 样本(原始文件大小 4.7mo/缩小版本 2.9mo)https://nofile.io/f/39Skta4n25R/bulletin1_ocr.pdf

编辑:适用于上述文件的轻型版本:https ://nofile.io/f/QOKfG34d5Cg/bulletin1_light.pdf

这是另一个不起作用的pdf的输入和输出文件(输入)https://nofile.io/f/sXsU0Mcv35A/bulletin15_ocr.pdf (通过上面的gs命令输出)https://nofile.io/f/ STdJYqqt6Fq/out.pdf

您会注意到输入和输出文件都是 27.6mo,而第一个文件减小了。

我还要补充一点,我已经使用 pdfocr 和 tesseract 引擎对这些 pdf 执行了 OCR,这就是为什么我没有尝试转换为 png 以减小大小,我需要额外的 OCR 层以便我们可以发布这些文件我们的网站,如果可能的话,我们希望它们更轻。

最终信息:ghostscript -v 为 9.10 (2013-08-30),tesseract 为 3.03,leptonica-1.70,pdfocr 为 0.1.4

希望大家能帮忙!

EDIT2:在等待答案时,我继续扫描和扫描文档,似乎在通过 pdfocr 传递我的 pdf 后,它像以前使用 ghostscript 一样缩小了。因此,我想知道脚本 pdfocr 是否使用 ghostscript 进行缩小,因为我知道它会在 OCR 化过程中为其他任务调用它。

标签: pdfresizeocrtesseractghostscript

解决方案


PDF 的媒体尺寸为 35.44 x 50.11 英寸,这真的是原件的尺寸吗?

鉴于您似乎经常使用 OCR,我假设您的 PDF 文件通常只包含非常大的图像。在这种情况下,对文件大小的主要影响将来自对图像的下采样。如果您查看文档,您可以看到 /screen 设置将图像下采样到 72 dpi,阈值为 1.5(因此超过 72 * 1.5 = 107 dpi 的图像将被下采样到 72,任何更少的东西都被认为不值得)

您的 PDF 文件的介质尺寸为 35.44 x 50.11 英寸。它是一个相当大的文件(26 页),所以我只考虑第 1 页。在这个页面上有一个图像和一堆不可见的文本,由 Tesseract 放置在那里。第 1 页上的图像是 8 位 RGB 图像,尺寸为 2481x3508,它覆盖了整个页面。

所以该图像的分辨率是 2481 / 35.44 x 3500 / 50.11 = 70.00 x 69.84

由于小于 72 dpi,pdfwrite 不会对其进行下采样。

如果您的媒体是 8.5 x 11 英寸,那么图像的有效分辨率将为 2481 / 8.5 x 2500 / 11 = 291.8 x 318.18,因此会被下采样约 4 倍。

但是.....对我来说,您的“工作” PDF 文件的媒体尺寸也很大,并且图像也已经低于下采样分辨率。当我使用您的命令行运行该文件时,输出文件的大小与输入文件的大小基本相同。

因此,我不知道您是如何体验到文件大小减小的。也许您也可以发布缩减后的文件。

编辑

所以,你的文件通过 Ghostscript 后变小的原因是因为绝大多数内容是扫描的页面。这些以 DCT 编码图像 (JPEG) 的形式存储在 PDF 文件中。

图像的分辨率足够低(见上文),它们不会被下采样。然而,旧版本的 Ghostscript 的工作方式是图像数据在读取时总是解压缩,然后在写入时重新压缩。

因为 JPEG 是一种有损图像格式,这意味着解压缩和重新压缩的图像质量低于原始图像,而应用质量损失的方式意味着数据压缩得更好。

因此,Ghostscript 工作方式的一个怪癖会导致您失去质量,但会获得更小的文件。请注意,对于当前版本的 Ghostscript,JPEG 数据会以不变的方式传递,除非您的配置要求对其进行降采样或颜色转换。

那么为什么它不压缩另一个文件呢?当然,对于当前代码,这就是我正在使用的,它不会,因为图像不需要下采样或任何东西。

现在,当我通过我在这里拥有的旧版本的 Ghostscript 运行它时(9.10,因为这是你的工作缩减文件正在使用的),那么我确实看到文件大小减少了。它从 26MB 下降到 15MB。

当我查看您的“不工作”缩减文件时,我发现是由 Ghostscript 9.23 生成的,而不是由 Ghostscript 9.10 生成的。

因此,您看到行为差异的原因是因为您已升级到较新版本的 Ghostscript,它可以更好地保持图像数据不变。

如果您真的想降低可以设置的图像质量,-dPassThroughJPEGImages=false但 IMO 您最好获取原始 PDF coreect 的媒体大小(肯定页面不是真正的 35x50 英寸?)或将 ColorImageResolution 设置为较低价值。


推荐阅读