从pdf提取表格

use*_*ser 5 python ocr python-2.7 pdfminer

我正在尝试从本PDF表格中获取数据。我已经尝试了pdfminer和pypdf,但还是有些运气,但是我不能真正从表中获取数据。

这是其中一张表的样子: 在此处输入图片说明

如您所见,有些列标有“ 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()
Run Code Online (Sandbox Code Playgroud)

这将产生一个文本文件,并获取所有文本,但是x不会保留间距。输出看起来像这样: 在此处输入图片说明

x在文本文档中只是单行

现在,我只是生成文本输出,但是我的目标是使用表中的数据生成一个html文档。我一直在寻找OCR示例,其中大多数似乎令人困惑或不完整。我愿意使用C#或任何其他可能产生所需结果的语言。

编辑:会有这样的多个pdf,我需要从中获取表数据。所有pdf的标头都相同(据我所知)。

use*_*ser 3

我明白了,我走错了方向。我所做的是为 pdf 中的每个表格创建 png,现在我正在使用 opencv 和 python 处理图像。

  • 您能更详细地描述一下该方法吗?你是如何提取表格的?您使用哪种类型的图像分割? (2认同)