当前位置: 首页 > 知识库问答 >
问题:

解析 PDF 文档中的表格

邢俊悟
2023-03-14

此链接(http://www.lenovo.com/psref/pdf/psref450.pdf)中的PDF包含许多类似这样的表格:

我想以编程方式从这些表中提取数据和结构。

我尝试过的事情:使用

  1. Tika:不幸的是,表格被转换为空格分隔的段落 - 并且某些字符串包含空格,因此无法拆分它们。
  2. Python的PDFMiner:由于缺少字体而返回断言错误。我怀疑 HTML 与 Ika 的输出相似,尽管我需要解决缺少字体的问题以确认这一点。
  3. 在线工具:我尝试了 http://www.zamzar.com/ 和其他几个工具。该文件太大而无法处理(对于在线服务),或者生成了错误。

我计划将PDF转换为HTML,然后用BeautifulSoup解析。

输出可以是JSON(例如,每个表一个对象)、XML或者几乎任何维护该结构的格式。

共有3个答案

颛孙飞鸾
2023-03-14

仅供参考,因为我的不是一个公开可用的工具:这是肯定可能的。这是一个纯文本格式的表格,其中的空格是制表符,而不是空格:

2469-2TU    i5-3320M    4GBx1   14.0" HD    720p    500G 7200   Intel 620528    WWAN upg    Express 54  Finger  BT  6   Win7 Pro64  10/12
✂ 2469-2SU  i5-3210M    4GBx1   14.0" HD    720p    500G 7200   Intel 2200  WWAN upg    Express 54  None    None    6   Win7 Pro64  10/12
✂ 2469-2RU  i3-3110M    4GBx1   14.0" HD    720p    320G 7200   Intel 2200  WWAN upg    Express 54  None    None    6   Win7 Pro64  10/12
2469-32U    i5-3230M    4GBx1   14.0" HD    720p    320G 7200   Intel 6205  WWAN upg    None    Finger  BT  6   Win7 Pro64  02/13
2469-2ZU    i5-3230M    4GBx1   14.0" HD    720p    320G 7200   Intel 2200  WWAN upg    None    None    None    6   Win7 Pro64  02/13
2469-2YU    i5-3320M    4GBx1   14.0" HD    720p    320G 7200   Intel 6205  WWAN upg    None    Finger  BT  6   Win7 Pro64  02/13
2469-2XU    i5-3320M    4GBx1   14.0" HD    720p    320G 7200   Intel 6205  WWAN upg    None    None    None    6   Win7 Pro64  02/13
2469-2WU    i5-3320M    4GBx1   14.0" HD    720p    320G 7200   WLAN upg    WWAN upg    None    Finger  BT  6   Win7 Pro64  02/13

我第二个PDFBox,因为它的工作原理类似于我自己的手写实用程序:询问(x,y)位置,排序,然后将“可能”字符串粘贴在一起,并在水平空间大于人们合理预期时插入一个制表符。

我甚至在Zapf Dingbats中得到了小剪刀:)

艾正浩
2023-03-14

@alex-woolford:总的来说,完美提取数据(有或没有你在PDF中看到的相同格式)并不总是可能的,尽管在某种程度上不到100%。我这么说是基于我之前参与过和你类似的项目。我遇到了和你类似的问题,网上的一些研究表明,PDF通常不是一种完全可逆的格式,也就是说,不可能总是100%准确地从PDF中恢复文本和格式。有时,在提取过程中,字符甚至会丢失或被转置,等等(使用一些库)。这似乎是由于PDF格式和规范的本质。它不是基于文本的格式。它是PostScript的衍生物,有一些关于数据布局的奇怪规则。这是根据官方的PDF文档,或者根据长期使用PDF的产品公司的网站,这些公司的产品是众所周知的。

如果不能容忍不完美的精度,有一些产品可用(到目前为止,我不知道Python的任何产品)。一个是xpdf,另一个是PDFTextStream。我用的是前者,而不是后者。xpdf 是一个 C 库,也有命令行工具。PDFTextStream是一个Java工具/库。它之前是付费产品,但最后我检查了一下,它现在对单线程应用程序 IIRC 是免费的。

尽管xpdf用于C,PDFTextStream用于Java,但您可以通过XML-RPC或其他分布式计算/跨语言通信方法(如套接字)从Python中调用它们。当然,这需要做一些工作。

赫特。

谭煜
2023-03-14

你可以试试PDFBox。文档在这里:

https://pdfbox.apache.org/1.8/cookbook/textextraction.html

扩展 org.apache.pdfbox.pdfviewer.PDFPageDrawer 并覆盖 strokePath 方法。从那里,您可以截获水平线段和垂直线段的绘制操作,并使用该信息来确定列和行位置。您可以设置文本区域以确定在哪个区域中绘制哪些数字/字母/字符。由于您知道区域的布局是表格的,因此您将能够使用简单的算法定义表并判断提取的文本属于哪一列和哪一行。

 类似资料:
  • 我正在尝试使用iText7库升级我的代码。以前我使用过iTextSharp库,但看起来iText7是全新的。我尝试阅读pdf文档,但在“未找到pdf标题”之间遇到了一个异常。这是我的密码 我做错了什么?

  • 主要内容:将JavaScript添加到PDF文档,示例在前一章中,我们学习了如何将图像插入到PDF文档中。 在本章中,将学习如何将JavaScript添加到PDF文档。 将JavaScript添加到PDF文档 可以使用类将JavaScript操作添加到PDF文档。 它代表了JavaScript操作。 以下是将JavaScript操作添加到现有PDF文档的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对

  • 问题内容: 我想要一个带pdf并返回文档中注释注释文本列表的python函数。我看过python- poppler(https://code.launchpad.net/~poppler-python/poppler- python/trunk ),但我不知道如何获取它来给我有用的东西。 我找到了该方法,并修改了通过调用它的演示程序,但是我不知道该如何处理AnnotMapping对象。它似乎没有完

  • 如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文档的某段内容,这样搜索文档时就不必先解析整篇文档,只会解析在 SoupStrainer 中定义过的文档. 创建一个 SoupStrainer 对象并作为 parse_only 参数给 BeautifulSoup 的构造方法即

  • 如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文档的某段内容,这样搜索文档时就不必先解析整篇文档,只会解析在 SoupStrainer 中定义过的文档. 创建一个 SoupStrainer 对象并作为 parse_only 参数给 BeautifulSoup 的构造方法即

  • 主要内容:Java DOM4J解析器 解析XML文档的步骤,Java DOM4J解析器 解析XML文档的示例Java DOM4J解析器 解析XML文档的步骤 以下是使用 DOM4J Parser 解析文档时使用的步骤。 导入与 XML 相关的包。 创建一个 SAXReader。 从文件或流创建文档。 通过调用 document.selectNodes() 使用 XPath 表达式获取所需的节点 提取根元素。 迭代节点列表。 检查属性。 检查子元素。 导入 XML 相关的包 创建一个文档生成器 从