【问题标题】:Extracting tables from a pdf从pdf中提取表格
【发布时间】:2015-01-13 17:22:39
【问题描述】:

我正在尝试从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 的标题都是相同的(据我所知)。

【问题讨论】:

  • 您是否在记事本中使用等宽字体?如果你不是,所有的赌注都没有。
  • 如果您使用的是 Windows,我相信您可以使用 Cygwin。
  • 我用的是等宽字体,可以用cygwin
  • 您是否一次性需要此 PDF,或者您有大量此类表格需要创建系统的转换过程?
  • 我需要一个系统化的流程,这样的 pdf 将会越来越多,但可能会略有不同。我还不知道,因为我还没有收到。

标签: python python-2.7 ocr pdfminer pdf-parsing


【解决方案1】:

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

【讨论】:

  • 您能否更详细地描述一下这种方法?你是如何提取表格的?您使用了哪种类型的图像分割?
  • 这是一篇旧帖子,但您能分享一下您是如何使用 opencv 获取 pdf 文件中的表格图像的吗?
  • 还有 Camelot,这是一个用于从 PDF 中获取表格的 python 工具。 github.com/socialcopsdev/camelot
  • @Saradhi 谢谢,我会检查一下
【解决方案2】:

尝试Tabula,如果可行,请使用tabula-extractor library(用 ruby​​ 编写)以编程方式提取数据。

【讨论】:

  • Tabula 几乎成功了。它可以看到大部分表格,但有些 x 一起在同一个单元格中。
  • 它只适用于基于文本的 pdf,而不适用于图像。有没有类似的东西可以从 pdf 图像中提取数据?
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多