从PDF中提取表格

5
我试图从这个PDF中的表格中获取数据。我已经尝试使用pdfminer和pypdf,但是我无法从表格中获得数据。
以下是其中一个表格的样子: enter image description here 如您所见,某些列用“x”标记。我试图将此表格转换为对象列表。
这是到目前为止的代码,我现在正在使用pdfminer。
# pdfminer test
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice, TagExtractor
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, PDFPageAggregator
from pdfminer.cmapdb import CMapDB
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure, LTImage
from pdfminer.image import ImageWriter
from cStringIO import StringIO
import sys
import os


def pdfToText(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ''
    maxpages = 0
    caching = True
    pagenos = set()

    records = []
    i = 1
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,
                                  caching=caching, check_extractable=True):
        # process page
        interpreter.process_page(page)

        # only select lines from the line containing 'Tool' to the line containing "1 The 'All'"
        lines = retstr.getvalue().splitlines()

        idx = containsSubString(lines, 'Tool')
        lines = lines[idx+1:]
        idx = containsSubString(lines, "1 The 'All'")
        lines = lines[:idx]

        for line in lines:
            records.append(line)
        i += 1

    fp.close()
    device.close()
    retstr.close()

    return records


def containsSubString(list, substring):
    # find a substring in a list item
    for i, s in enumerate(list):
        if substring in s:
            return i
    return -1


# process pdf
fn = '../test1.pdf'
ft = 'test.txt'

text = pdfToText(fn)
outFile = open(ft, 'w')
for i in range(0, len(text)):
    outFile.write(text[i])
outFile.close()

那会生成一个文本文件并获取所有文本,但是x的间距不会被保留。输出结果如下: enter image description here 文本文档中的x只有单个空格。
现在,我只是产生文本输出,但我的目标是使用表格数据生成html文档。我一直在寻找OCR示例,但大多数似乎令人困惑或不完整。我可以使用C#或任何其他可能产生我需要的结果的语言。
编辑:将有多个类似于此的pdf,我需要从中获取表格数据。标题对于所有pdf都将相同(据我所知)。

你在Notepad中使用等宽字体了吗?如果没有,那么一切都无从谈起。 - Robert Harvey
如果你使用的是Windows系统,我相信你可以使用Cygwin。 - Mr. Polywhirl
我正在使用等宽字体,并且我可以使用Cygwin。 - user
1
您是只需要一次性使用这个PDF文件,还是有大量类似表格需要创建系统化转换过程呢? - Ilya Evdokimov
我需要一个系统化的流程,因为将会有更多类似但可能略有不同的PDF文件。我还不知道具体情况,因为我还没有收到它们。 - user
2个回答

3

我明白了,我一开始的方向是错误的。我的做法是将pdf文件中每个表格都转换成png格式的图片,然后使用opencv和python来处理这些图像。


2
请您能否更详细地描述一下方法?您是如何提取表格的?使用了哪种类型的图像分割? - sdk
这是一篇旧帖子,但您能否分享一下如何使用OpenCV在PDF文件中获取表格图像的方法? - Rikkas
还有一个名为Camelot的Python工具,用于从PDF中获取表格。https://github.com/socialcopsdev/camelot - james-see
1
@Saradhi 谢谢,我会去查看的。 - user

2

Tabula 差不多可以工作了。它能看到大部分的表格,但是一些 x 在同一个单元格中。 - user
它只能在基于文本的PDF上工作,而不能在图像上工作。是否有类似的工具可以从PDF图像中提取数据? - Sundeep Pidugu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接