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

2024-01-23

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

我从用户那里收到的文件是sample.pdf(我已经使用原始文件以及我在此处生成的文件创建了一个存档:https://dl.dropboxusercontent.com/u/1390155/tess-files/sample.zip 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 来减小超立方体后的 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 参数,会产生一个 43k 文件,PDF 质量稍差,并且存在缺少空格的相同问题:

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 图像的质量(尽管理想情况下我希望保留颜色)。

非常感谢任何帮助!


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

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

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

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

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

在渲染为 TIFF 和 OCR 之前弄乱原始 PDF 文件似乎不太可能any与最终 PDF 文件大小的差异(注意;压缩可能效果更好,因为可能有更多“平坦”颜色区域)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何减小tesseract生成的PDF的大小? 的相关文章

  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • 使用 ps2pdf (ghostscript) 创建正确的 PDF/X

    我已经为此苦苦挣扎了几天 所以我想我应该在这里寻求帮助 基本上 我尝试使用 ps2pdf 版本 9 10 创建正确的 PDF X 1 和 PDF X 3 文档 是的 我知道据说 ps2pdf 仅支持 PDF X 3 请参阅这个线程 http
  • 使用带有图像的 C# 代码生成 pdf 文件的大小限制是多少?

    我正在使用 Web 应用程序使用 C 代码生成 PDF 文件 PDF 文件包含 tiff 图像 如果包含图像的文件夹大小超过 1GB 则浏览器将自动关闭 使用 C 代码生成 PDF 文件的图像大小限制是多少 您问题的答案取决于三个参数 PD
  • 使用 pdfkit 和 FastAPI 下载 PDF 文件

    我将使用 FastAPI 创建一个 API 将HTML页面到 PDF 文件 使用pdfkit 但是 它将文件保存到我的本地磁盘 当我在线提供此API后 用户如何将该PDF文件下载到他们的计算机上 from typing import Opt
  • 如何使用 iTextSharp 插入 HTML 标记以使用 C# 创建 PDF?

    I am new to iTextSharp API to create PDF I want to Create the a PDF similar shown in following image I have added Table
  • 如何以编程方式生成在图像顶部带有标签的维恩图图像?

    我正在尝试为 pdf 报告生成维恩图 其中文本位于不同区域的顶部 我们使用 htmldoc 生成 pdf 这会排除背景图像之上的文本 我们使用谷歌图表 API 来处理其他图像 但他们的维恩图不支持图表顶部的文本 据我所知 最简单的路径是使用
  • 使用 Zend Framework 2 生成 PDF 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我现在开始学习 ZF2 并注意到 zend Framework 2 上没有 Zend Pdf 或类似内容 如何在此版本的框架上创建 pdf
  • itextsharp读取表[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 itextsharp 创建了一个带有表格的 pdf 我找到了一个例子http itextsharp sourceforge n
  • Rails 4 - 如何链接到 PDF 文件(名称.PDF)?

    我正在生成 PDF 文件 我的链接如下所示 当我点击这个时 它会带我去 display invoice 123456789 这是一个 HTML 版本 在控制器中的操作如下 def display invoice if params invo
  • Rails 中的 PDF 导出

    我需要将包含一些图表的 HTML 页面导出为 PDF 有哪些好的 gem 可以做到这一点 PDFKit http railscasts com episodes 220 pdfkit http railscasts com episodes
  • PDF Tj 命令带有尖括号?

    我试图弄清楚在哪里未压缩的PDF v1 4 文档使用 Times 字体 The Font描述 PDF 中 Times 字体的对象是 object65如下 65 0 obj lt Font Subtype TrueType BaseFont
  • 直接将 .aspx 转换为 .pdf [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • 是否可以修改 PDF 表单字段名称?

    情况是这样的 我有一个 PDF 其中包含自动生成的 pdf 表单字段名称 问题是这些名称不太用户友好 它们看起来像 topmostSubform 0 Page1 0 Website Address 0 我希望能够更改它们 使它们类似于 We
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 编码员的 PDF 规范:Adobe 还是 ISO?

    我想编写一个可以读取和解码 pdf 文档的应用程序 现在我应该在哪里获取此文件格式的规格 PDF 格式是由 ISO 组织标准化的 但我不清楚哪里是获取此类信息的最可靠来源 什么是开始使用这种文件格式的好来源 您实际上可以使用您提到的两个来源
  • 如何在无头模式下使用 Libre Office Draw 从命令行创建 PDF/A?

    LibreOffice Draw 允许您打开非 PDF A 文件并将其导出为 PDF A 1b 或 PDF A 2b 文件 通过在 macOS 上调用命令行也可以实现相同的效果 Applications LibreOffice app Co
  • Windows 如何批量打印 PDF 文档?

    在我的机器上 当在 Windows 资源管理器中选择多个 PDF 文档时 右键单击并选择Print Adobe Acrobat Reader 将最小化打开 所有文档都会静默发送到打印机 我想做Windows一样的事情 但是怎么做呢 我在用P
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl
  • 如何在启用嵌入时间戳和 LTV 的情况下签署 PDF?

    我正在尝试签署启用了时间戳和 LTV 的 pdf 以便它在 Adob e Reader 中显示如下 在英语中 这意味着 签名包含嵌入的时间戳 和 签名启用了 LTV 这是我正在使用的代码 PrivateKey pk get pk from

随机推荐

  • 你能在c#中使用“where”来要求属性吗?

    我想创建一个只接受可序列化类的泛型类 可以通过 where 约束来完成吗 我正在寻找的概念是这样的 public class MyClass
  • 在所有 DataFrame 列中搜索值(第一列除外!)并添加具有匹配列名称的新列

    我想对 DataFrame 的所有列 第一列除外 进行搜索 并添加一个具有匹配列名称的新列 如 Column Match 我尝试过这样的事情 df apply lambda row row astype str str contains m
  • 如何使用javascript更改CSS类属性? [复制]

    这个问题在这里已经有答案了 有人可以告诉我如何通过 javascript 更改 css 类属性吗 例子 winner background color white 如何更改班级获胜者背景颜色的值 当我写的时候 var some docume
  • 如何绘制渐变路径

    我怎样才能画画Path带有褪色 不透明度或粗细 线 像这样的东西 我知道有LinearGradient着色器Paint 但不会bend沿着Path 一种可能的解决方案可能是沿着Path然后我自己通过分段来绘制它 但我也找不到任何方法 我想出
  • Eloquent chunk() 缺少一半结果

    我对 Laravel 的 ORM Eloquent chunk 方法有疑问 它错过了一些结果 这是一个测试查询 destinataires Destinataire where statut lt 3 gt where tokenized
  • Travis CI 可以为特定 Matrix 配置生成徽章吗?

    我正在针对两个不同版本的 SDK 测试我的库 稳定 SDK 和开发 SDK 具体来说 https travis ci org google serialization dart https travis ci org google seri
  • 检查号码是否在范围内

    我正在检查来自输入字段的号码是否在范围内 function timeCheck var time trim enterTime value Number prototype between function min max return t
  • 如何知道 Node.js Express 服务器何时启动并可供使用

    有一个应用程序 我想启动节点快速服务器 然后在服务器启动后立即在同一台计算机上自动启动浏览器 如何查询服务器是否已启动并准备就绪 我真的希望在 listen 调用上有某种回调 但似乎没有 我可以等待比我预期的时间更长的时间 但是这是在现场的
  • 用作 Google Chrome 书签

    先说一下我遇到的问题 我需要多次填写同一个网页 而且我需要填写的内容大部分是相同的 但分散在整个网页中 我想到的解决方案 我知道有一种方法可以创建一些 javascript 函数 将其放在 google 书签后面 这样当您在该页面上时 只需
  • Composer 2.0.8 问题 package-versions-deprecated

    使用 PHP 7 2 Installing composer package versions deprecated 1 8 0 Extracting archive Plugin initialization failed include
  • 可以裁剪相机预览吗?

    我还没有找到任何方法来裁剪相机预览然后将其显示在 SurfaceView 上 Android 是否可以裁剪相机预览 您可以在没有覆盖视图的情况下执行此操作 这不适用于所有情况 子类化 ViewGroup 将 SurfaceView 添加为唯
  • Jasper Reports 在新页面上的子报表

    我有一个 jasper 报告 由 6 个子报告组成 每个子报告都有自己的标题部分 现在我需要每个报告都从新页面开始 我尝试添加分页符 但它对我不起作用 在研究这个问题时 我遇到了一个设置技巧isTitleNewPage to true at
  • 服务器打印到标准输出而不是套接字

    我正在研究 UNIX 网络编程中的示例 并且我已将 daytimeclientserv c 改编成此处的代码 服务器按预期向客户端发送日期 时间字符串 但启动时收到的第一个请求除外 当我第一次运行服务器程序 在局域网中的另一台计算机上 时
  • Linq lambda 表达式中的布尔短路求值

    我有以下 Linq lambda 表达式 private IEnumerable
  • 使用 postgresql 数据库时,uwsgi 下的 django 应用程序无法启动

    我设置了一个应用程序AWS 上的 Ubuntu 14 04 gt NGINX gt UWSGI gt DJANGO 应用程序 使用 sqlite3 时该应用程序运行完全正常 但是当我使用django db backends postgres
  • ZfcUser 中的用户状态到底是什么?

    谁能告诉我 用户状态 是什么ZfcUser https github com ZF Commons ZfcUser正在做什么以及为什么我们可能需要它 这个用户状态是什么意思 我认为这不是它所指的角色 可以通过向 zfcuser global
  • Android/SQLite - WHERE 子句上的位操作

    我想知道在 Android 中是否可以做这样的事情 public Cursor getFlowsByCategory int type int categoryID int limit SQLiteDatabase db dbHelper
  • canvas 与 openGL 的功能是什么?

    我知道如果你向 openGL 发送静态且很少变化的纹理 例如像图块一样 openGL 会产生奇迹 但当你有不断变化的精灵时就不行了 是否有可能纯粹从画布上创建类似绑架这样的游戏 它的性能如何 可以使用画布创建诸如绑架之类的游戏 但最终您将在
  • 在经典 ASP 中使用“错误继续下一步”,以及如何处理错误

    大家好 我想问一个关于on error resume next 假设我们有一个循环来浏览记录集 例如 Do while not rs EOF query UPDATE conn execute query rs movenext loop
  • 如何减小tesseract生成的PDF的大小?

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