【问题标题】:How to reduce the size of the PDF generated by tesseract?如何减小 tesseract 生成的 PDF 的大小?
【发布时间】:2014-11-06 08:57:48
【问题描述】:

我的(网络)应用程序的设置如下:我获取用户上传的 PDF 文件,对它们运行 OCR 并向他们展示 OCRed PDF。由于一切都在线,因此最小化生成的 PDF 文件的大小是减少用户加载和等待时间的关键。

我从用户那里收到的文件是 sample.pdf(我创建了一个包含原始文件以及我在此处生成的文件的存档:https://dl.dropboxusercontent.com/u/1390155/tess-files/sample.zip)。我使用 tesseract 3.04 并执行以下操作:

gs -r300 -sDEVICE=tiff24nc -dBATCH -dNOPAUSE -sOutputFile=sample.tiff sample.pdf
tesseract sample.tiff sample-tess -l fra -psm 1 pdf

OCR 的结果很好,但是生成的 PDF 的大小现在大约是原来的 2.5 倍

  • 原始pdf文件大小:60k
  • 最终 pdf 大小:147K

所以我问你,我怎样才能在保持 OCR 结果的同时减小生成的 PDF 的大小?

一个明显的解决方案是在生成 tiff 时降低分辨率,但我不想这样做,因为它可能会影响 OCR 结果。

我尝试的第二件事是使用 ghostscript 在 tesseract 后减小 PDF 大小:

gs -o sample-down-300.pdf   -sDEVICE=pdfwrite   -dDownsampleColorImages=true \
   -dDownsampleGrayImages=true   -dDownsampleMonoImages=true  \
   -dColorImageResolution=300   -dGrayImageResolution=300  \
   -dMonoImageResolution=300   -dColorImageDownsampleThreshold=1.0  \
   -dGrayImageDownsampleThreshold=1.5   -dMonoImageDownsampleThreshold=1.0 \
    sample-tess.pdf 

这有点帮助,生成的文件只有101K,大约是原来的1.5倍。我可以忍受,但它似乎也会影响 OCR 结果。例如,现在缺少“RESTAURANT”和“PIZZERIA”(第二行)之间的空白。

ghostscript 的另一个(更简单)选项,使用 ebook 参数,导致 PDF 中质量较低的 43k 文件和缺少空格的相同问题:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \
    -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=sample-ebook.pdf \
     sample-tess.pdf

PDF 的质量稍差一点也不错,但我也不想在 OCR 上妥协。

我已经使用 PNG 和 JPEG 进行了其他测试,但 OCR 结果总是下降(即使是轻微的),并且生成的 PDF 也不小。例如,使用 PNG:

convert -density 300 sample.pdf -transparent white sample.png
tesseract sample.png sample-tess-png -l fra -psm 1 pdf

缺少总数 (55.50),最终 PDF 大小为 149k。

总而言之,这是我的问题:

  • 有人能解释一下为什么要减小 PDF 的大小吗? ghostscript 会影响 OCR 结果吗?我以为文本层和 图像层是独立的...
  • 是否有可供选择的选项 tesseract 在生成 PDF?
  • 我了解到 ABBYY OCR 等其他解决方案使用混合光栅化 内容 (MRC) 以减小文件大小。 tesseract 会这样做吗 已经?如果没有,是否有一些开源或专有的 CLI 工具 这样做,我可以用它来减少 tesseract 生成的 PDF 文件?

再一次,只要用户可以搜索文本并选择它以从 PDF 中复制/粘贴,我就可以在 PDF 图像的质量上妥协(尽管我希望保留颜色,理想情况下)。

非常感谢任何帮助!

【问题讨论】:

  • 您正在生成tiff24nc 文件。您是否也尝试过tiffg4 并比较结果?
  • 我打开了一个新问题来实现您在我编写的工具中寻找的功能,该工具是 tesseract 的包装器。希望我能尽快得到它。这里是:github.com/ElectricRCAircraftGuy/PDF2SearchablePDF/issues/5.

标签: pdf pdf-generation ocr tesseract ghostscript


【解决方案1】:

问题 1,我看不到任何“附加”到此的文件,所以我在黑暗中猜测。

PDF 中没有“文本层”或“图像层”,PDF 可能有层,但这是独立的。文本和图像“按原样”嵌入文件中。当然,将 PDF 渲染为 TIFF 图像的结果确实会生成单个图像文件。

原始 PDF 将使用字体将文本存储为文本,TIFF 文件会将整个文件呈现为图像。我不确定 tesseract 究竟是如何工作的,如果没有它的输出示例,我无法确定,但我希望它的作用是在输出 PDF 文件中保持渲染图像完整,并使用渲染模式 3 添加文本(两者都不描边也不填充,即不可见)。这就是您在上面所说的“MCR”。

这对您来说意味着原始 PDF 很小,因为大部分(可能是全部)内容都被描述为矢量数据。生成的 TIFF 文件很大,因为它是一个完整的页面位图,使用矢量表示获得的节省已经丢失。然后将其转换为 PDF(仍然很大),然后将更多文本和字体添加到文档中,这当然只会增加其大小。

唯一会对该文件的大小产生重大影响,实际上,是减小位图图像的大小,即用于创建最终输出 PDF。

在渲染到 TIFF 和 OCR 之前弄乱原始 PDF 文件似乎不太可能对最终 PDF 文件大小产生任何差异(警告;压缩可能效果更好,因为可能有更多“平面”区域'颜色)

没有看到原始文件和最终文件,我真的不能说更多,而且我自己也无法测试它(我没有安装 Tesseract),但在我看来,唯一的真正的解决方案是在创建最终输出 PDF 文件之前让 Tesseract 对图像进行下采样。

【讨论】:

  • 对不起,我忘了附上文件;我现在已将 URL 放入包含所有相关文件的存档。
  • 另外,我认为 tesseract 必须对图像进行一些下采样,因为如果它只是存储 .tiff 文件,它会是 4.5M 大而不是 150K。
  • 它可以(可能确实)压缩图像,可能使用 Flate。
  • 我可能要到星期一才有机会好好看看这个,但我注意到你的 sample_down_300.pdf 中有 JPEG 伪影,这可能是导致 OCR打嗝。看起来原始 PDF 文件只是包装为 PDF 的图像。事实上,快速浏览告诉我这已经是一个 PDF 文件,其中文本是在文本渲染模式 3 中绘制的。所以这个文件已经通过了你用 Tesseract 描述的过程。它是通过 OCR 处理的图像。
  • OK 原始图像不是 JPEG 编码的。要获得所需的下采样,但避免使用 JPEG 编码(这会导致可能混淆 OCR 过程的令人讨厌的伪影),您需要设置 ColorImageFilter、GrayImageFilter 和 MonoImageFilter,我建议使用 FlateEncode,不要使用 PDFSRETTINGS=/ebook(或其他任何东西),因为这会设置大量您可能不想要的东西。原始图像是600 dpi,你应该可以到至少300,也许更少。因为图像大部分是空白,所以实际上使用 Flate 压缩比使用 JPEG 更好。
【解决方案2】:

首先,Tesseract 是一个 OCR 引擎。你不能指望它除了 OCR 之外的任何功能都会得到优化。它很好地完成了 OCR,而不是其他东西。它确实可以做其他事情,例如,如果您尚未对其进行阈值处理(使用 Otsu 方法),它会对您提供的任何图像进行阈值处理,但是您可以先自己对图像进行阈值处理,然后将其传递给 Tesseract,假设您有一个想法你给它的东西。

这都不是 Tesseract 问题。空格发生变化的原因是由于 PDF 查看器猜测字/行空格,因为这些没有被编码。如果文本相同并且间距受到干扰,则完全是 PDF 查看器问题。它在 PDF 之间发生变化的原因是因为您正在更改分辨率/画布大小,并且会干扰 PDF 查看器的字/行间距计算。要进行比较,您可以查看 Adob​​e Acrobat 中任何页面的内容对象,它位于 Preflight | 下。选项 |浏览内部 PDF 结构。

我要问的第一个问题是为什么要修改 PDF 中的图像?当然它们不应该是,它们应该与您开始使用的图像完全相同,只是将文本层(是的文本层,它是文本,它分层在图像 = 文本层上)在顶部不可见地插入。您可以使用“浏览内部 PDF 结构”(或记事本)查看任何图像对象的大小,看看它们是否相同。如果不是,您想阻止它们被更改,或者您想保存它们然后在最终的 PDF 中替换它们。

否则文本可能没有被压缩。 PDF 支持 Deflate。毫无疑问,Ghostscript 或 PDFTK 中有一个设置可以压缩所有内容对象。

您当然不必降低 PDF 中图像的质量。如果我是你的用户/客户之一,我认为你给我的和我给你的不一样我不会很高兴——那会让你的服务毫无用处。

【讨论】:

  • 感谢您的回答!我不希望 Tesseract 输出任何优化的东西,但我也不希望它使我的 PDF 大小增加三倍......关于不降低图像质量的好点。为了跟进您的建议,我如何事先保存图像并在最终的 PDF 中替换它们?
  • 嗯,您要么需要阅读 PDF 规范并自己编程,要么需要找到可以为您执行此操作的应用程序。但是,您应该首先通过比较前后的内部PDF结构来检查它们是否是。
【解决方案3】:

由于您使用 Tesseract 3.04,它支持您可能想要查看的各种压缩模式。

  --force-transcode=[true|false]
  --force-lossless=[true|false]
  --force-compression-algorithms=[dct|flate|g4|lzw|jpx|jbig2]

问题12851300

【讨论】:

  • 我认为这些选项没有得到实施,或者是吗?看来你提到的两个问题的结果是让 tesseract 自动选择压缩方案(见 commit d0cb1071b288)。
  • 我不确定;当我尝试它们时,来自 repo 的最新版本 Tesseract 接受了它,但输出似乎没有差异。它们可能未实现,如果指定则忽略。程序可能会根据图像类型确定压缩方案。
猜你喜欢
  • 2018-03-03
  • 2013-05-22
  • 2011-03-17
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多