编程语言
首页 > 编程语言> > python – 从pdf中提取表

python – 从pdf中提取表

作者:互联网

我试图从这个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()

这会生成一个文本文件,它会获取所有文本但是,x没有保留空格.输出如下所示:

x是文本文档中的单个间隔

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

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

解决方法:

我弄清楚了,我的方向是错误的.我所做的是在pdf中创建每个表的png,现在我正在使用opencv& amp处理图像.Python.

标签:python,python-2-7,ocr,pdfminer
来源: https://codeday.me/bug/20190628/1318902.html