解析PDF文档中的表格

时间:2014-03-24 21:40:06

标签: python parsing pdf pdfbox apache-tika

此链接中的PDF(http://www.lenovo.com/psref/pdf/psref450.pdf)包含许多表格,如下所示:

enter image description here

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

我尝试过的事情:使用

将PDF转换为HTML
  1. Tika :不幸的是,表格被转换为空格分隔 段落 - 有些字符串包含空格,所以它是 分裂它们是不可能的。
  2. Python的PDFMiner :由于缺少字体而返回了断言错误。我怀疑HTML会与输出相似 Tika,虽然我需要解决丢失字体的问题 确认一下。
  3. 在线工具:我尝试了http://www.zamzar.com/和其他几个。该文件太大而无法处理(对于在线 服务)或它产生的错误。
  4. 我计划将PDF转换为HTML,然后使用BeautifulSoup解析它。

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

3 个答案:

答案 0 :(得分:5)

您可以尝试PDFBox。该文档的文档如下:

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

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

答案 1 :(得分:1)

@ 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调用它们。当然,还会涉及一些工作。

HTH。

答案 2 :(得分:1)

仅限FYI,因为我的工具不是公开的工具:确定可能。这是一个纯文本形式的表 - 中间的空格是制表符,而不是空格:

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中得到了小剪刀:)