如何减小tesseract生成的PDF大小?

8
我的(web)应用程序的设置如下:我会获取用户上传的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的选项,使用电子书参数,在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。
总之,以下是我的问题:
- 有人能解释一下为什么使用ghostscript缩小PDF大小会影响OCR结果吗?我认为文本层和图像层是独立的... - 在tesseract生成PDF时,有哪些选项可以降低图像质量? - 我读到其他解决方案如ABBYY OCR使用混合光栅内容(MRC)来减小文件大小。tesseract是否已经实现了这一点?如果没有,是否有一些开源或专有的CLI工具可以用来减小tesseract生成的PDF文件? - 再次强调,只要用户可以搜索文本并从PDF中选择复制/粘贴,我就可以妥协PDF图像的质量(尽管我希望保留颜色)。
非常感谢任何帮助!

你正在生成tiff24nc文件。你是否也尝试过使用tiffg4并比较结果? - Kurt Pfeifle
我打开了一个新问题,以在我编写的一个围绕tesseract的工具中实现您正在寻找的功能。希望我能尽快处理它。这是问题链接:https://github.com/ElectricRCAircraftGuy/PDF2SearchablePDF/issues/5。 - Gabriel Staples
3个回答

1

由于您使用的是Tesseract 3.04版本,它支持各种压缩模式,您可能需要进行检查。

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

问题 12851300

我不认为这些选项被实现了,或者它们被实现了吗?似乎你提到的两个问题的结果是让 Tesseract 自动选择压缩方案(请参见提交 d0cb1071b288)。 - seb
我不确定;当我尝试使用它们时,来自repo的最新版本Tesseract可以接受,但输出似乎没有任何区别。它们可能没有被实现,如果指定了也会被忽略。程序可能根据图像类型确定压缩方案。 - nguyenq

1
问题1,我看不到任何“附加”的文件,所以我在猜测。
PDF中没有“文本层”或“图像层”,PDF可能有层,但这是独立的。文本和图像嵌入在文件中“如此”。当然,将PDF渲染为TIFF图像的结果确实会产生单个图像文件。
原始PDF将文本存储为文本,使用字体,TIFF文件将整个内容呈现为图像。我不确定tesseract的工作方式,也没有输出示例,但我希望它所做的是在输出PDF文件中保留呈现的图像,并使用呈现模式3(既不描边也不填充,即不可见)添加文本。这就是您上面描述的“MCR”。
对于您来说,这意味着原始PDF很小,因为许多(也许全部)内容都被描述为矢量数据。生成的TIFF文件很大,因为它是完整的页面位图,使用矢量表示获得的节省已经丢失。然后将其转换为PDF(因此仍然很大),然后向文档添加更多文本和字体,这当然只会增加其大小。
“唯一”能够实质性地减小文件大小的方法是减小位图图像的大小,也就是您用来创建最终输出PDF的TIFF文件。
在渲染到TIFF和OCR之前修改原始PDF文件似乎不会对最终PDF文件大小产生任何影响(注意:压缩可能效果更好,因为可能存在更多的“平坦”颜色区域)。
没有看到原始文件和最终文件,我无法说更多,而且我没有安装Tesseract也无法自行测试,但我认为唯一的解决方案是让Tesseract在创建最终输出PDF文件之前对图像进行降采样。

抱歉我的失误,我忘记附上文件了;我现在已经放置了一个包含所有相关文件的URL地址。 - seb
此外,我认为Tesseract必须对图像进行一些降采样操作,因为如果仅存储.tiff文件,它将达到4.5M,而不是150K。 - seb
它可能(很可能)会压缩图像,可能使用Flate算法。 - KenS
我可能要等到周一才有机会好好看一下这个,但我注意到你的sample_down_300.pdf文件中有JPEG伪影,这可能是导致OCR出现问题的原因。看起来原始PDF文件只是一个包装成PDF格式的图像。事实上,快速查看告诉我,这已经是一个使用文本渲染模式3绘制文本的PDF文件。因此,该文件已经通过Tesseract进行了您描述的处理过程。它是经过OCR处理的图像。 - KenS
让我们在聊天中继续这个讨论。点击此处进入聊天室 - seb
显示剩余4条评论

1
首先,Tesseract是一种OCR引擎。除了OCR之外,您不能期望它具有任何其他优化功能。它的OCR表现非常出色,但其他方面则不然。它确实可以做其他事情,例如对于您提供的图像,如果没有进行阈值处理(使用Otsu方法),它会进行阈值处理,但是如果您先自己对图像进行阈值处理,然后再将其传递给Tesseract,则会获得更好的结果,前提是您知道自己在输入什么。

所有这些都不是Tesseract的问题。空格变化的原因是PDF查看器猜测单词/行间距,因为这些未经编码。如果文本相同而间距受到干扰,则完全是PDF查看器的问题。之所以在PDF之间发生变化是因为您正在更改分辨率/画布大小,这会影响PDF查看器对单词/行间距计算的干扰。要进行比较,您可以在Adobe Acrobat中查看任何页面的内容对象,它位于Preflight | Options | Browse Internal PDF Structure下。

我首先会问的问题是,为什么PDF中的图像需要进行修改?它们应该与您最初使用的图像完全相同,只是在其上方无形地插入文本层(是文本且覆盖在图像上 = 文本层)。您可以使用“浏览内部PDF结构”(或记事本)查看任何图像对象的大小,并查看它们是否具有相同的大小。如果不是,则需要停止对它们进行更改,或者将它们保存并在最终的PDF中替换它们。
否则,也许文本没有被压缩。PDF支持Deflate。毫无疑问,在Ghostscript或PDFTK中有一个设置,可以压缩所有内容对象。
您肯定不需要降低PDF中图像的质量。如果我是您的用户/客户之一,我认为我不会满意您给我的回报不同于我给您的 - 这将使您的服务变得无用。

谢谢你的回答!我并不指望Tesseract输出任何优化过的内容,但我也不希望它将我的PDF文件大小增加三倍...关于不降低图像质量的好建议。为了跟进你的建议,我应该如何事先保存这些图片并在最终的PDF中替换它们呢? - seb
你需要阅读PDF规范并自己编写程序,或者找到一个可以为你完成此操作的应用程序。但是,在此之前,你应该先比较PDF结构的内部变化,以确定它们是否一致。 - Alasdair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接