此链接中的PDF(http://www.lenovo.com/psref/pdf/psref450.pdf)包含许多表格,如下所示:
我想以编程方式从这些表格中提取数据和结构。
我尝试过的事情:使用
将PDF转换为HTML我计划将PDF转换为HTML,然后使用BeautifulSoup解析它。
输出可以是JSON(例如每个表一个对象),XML,或几乎任何维护结构的格式。
答案 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中得到了小剪刀:)