【问题标题】:Extract text of PDF without tool无需工具即可提取PDF文本
【发布时间】:2019-06-21 18:08:36
【问题描述】:

目前我正在使用 itextsharp 工具(在 VB.net 中)提取 PDF 的文本。 我想独立于其他工具/库,因为我不能在我的程序中将它们提供给其他人。

是否有任何编程语言的解决方案(没有 .dll 等)来快速提取 PDF 的文本?

【问题讨论】:

  • 基本上,您必须重新实现 PDF 库(如 iText)的大部分功能,以实现通用文本提取例程。 (如果您输入的 PDF 的结构非常简单,那么您可能会逃脱网络上流传的黑客攻击之一。但这些黑客攻击仅适用于非常简单的 PDF。外观并不简单,但其内部结构并不简单。)
  • 您的相关帖子stackoverflow.com/questions/54439702/… 表明您并不希望独立。您正在寻找摆脱 AGPL 的方法。只需诚实地陈述你的意图。

标签: vb.net pdf text itext extraction


【解决方案1】:

简答:

当然有办法做到这一点。 iText(与许多其他 PDF 库一起)能够做到这一点。于是就有了提取文本的算法。

长答案:

PDF 不是所见即所得的格式。 PDF 文档是“相互引用的对象”和“编程语言”之间的一种邪恶结合。

让我解释一下。 PDF 文档具有图形状态。因此,每当您在 PDF 文档中看到文本(在 Adob​​e Reader 等查看器中)时,您实际上就是在 PDF 文档中看到一些“代码”的结果

转到位置 50、720
将活动字体设置为 Helvetica,fontsize 12
将活动绘图颜色设置为黑色
绘制与字符“H”对应的字形
转到位置 53, 720
绘制与字符“e”对应的字形
等等

指令和资源(如字体、图像、矢量图形)可以在对象中组合在一起。

每个对象都分配了一个编号,并在交叉引用表中明确提及(在 PDF 文档的末尾)。

因此,为了阅读 PDF 文档中的文本,您需要:

  1. 读取外部参照表
  2. 找出 \page 对象的起始位置(字节位置)
  3. 解析 \page 对象及其所有子对象(再次使用 XREF 表确定每个子对象在文件中的位置)
  4. 解析几何指令(图形状态不需要与文本同向流动)
  5. 根据您希望写入文本的方向对所有可见字符(比较背景和前景色、其他对象(例如图像等)的遮挡等)进行排序
  6. 构建返回字符串

这可能就是其他人使用库的原因。 不要误会我的意思,我非常喜欢自己动手(这是深入了解某些事情如何运作的最佳方式)。

但是从您的一位用户的角度来看。 你会更相信什么?

  • 使用“自写”代码处理 PDF 文档的程序(解析 PDF 文档的总经验
  • 或简单调用 PDF 库的程序(总经验 解析 PDF 文档 > 20 年)

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-05-21
    相关资源
    最近更新 更多