【问题标题】:How to extract tables from a pdf with PDFMiner?如何使用 PDFMiner 从 pdf 中提取表格?
【发布时间】:2017-09-14 15:20:32
【问题描述】:

我正在尝试从 pdf 文档中的某些表格中提取信息。
考虑输入:

Title 1
some text some text some text some text some text
some text some text some text some text some text

Table Title
| Col1          | Col2    | Col3    |
|---------------|---------|---------|
| val11         | val12   | val13   |
| val21         | val22   | val23   |
| val31         | val32   | val33   |

Title 2
some more text some more text some more text some more text
some more text
some more text some more text some more text some more text

我可以这样得到大纲/标题:

path='myFile.pdf'
# Open a PDF file.
fp = open(path, 'rb')
# Create a PDF parser object associated with the file object.
parser = PDFParser(fp)
# Create a PDF document object that stores the document structure.
# Supply the password for initialization.
document = PDFDocument(parser, '')
outlines = document.get_outlines()
for (level,title,dest,a,se) in outlines:
    print (level, title)

这给了我:

(1, u'Title 1')
(2, u'Table Title')
(1, u'Title 2')

这是完美的,因为级别与文本层次结构对齐。现在我可以按如下方式提取文本:

if not document.is_extractable:
    raise PDFTextExtractionNotAllowed
# Create a PDF resource manager object that stores shared resources.
rsrcmgr = PDFResourceManager()
# Create a PDF device object.
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
# Create a PDF interpreter object.
interpreter = PDFPageInterpreter(rsrcmgr, device)
# Process each page contained in the document.
text_from_pdf = open('textFromPdf.txt','w')
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)
    layout = device.get_result()
    for element in layout:
        if isinstance(element, LTTextBox):
            text_from_pdf.write(''.join([i if ord(i) < 128 else ' '
                                            for i in element.get_text()]))

这给了我:

Title 1
some text some text some text some text some text some text some text
some text some text some text some text some text some text some text
Table Title
Col1
val11
val12
val13
Col2
val21
val22
val23
Col3
val31
val32
val33
Title 2
some more text some more text some more text some more text
some more text
some more text some more text some more text some more text

这有点奇怪,因为表格是以列方式提取的。我可以逐行获取表格吗?此外,如何确定表格的开始和结束位置?

【问题讨论】:

  • 如果您可以逐列提取表格并将其存储到 2D list(列表列表)中,那么您应该能够将其转置为一行-逐行格式。这通常通过内置的zip() 函数完成。至于查找表的结尾,您需要查看是否可以检测到格式的某种变化。
  • 谢谢,但问题是我不知道表格从哪里开始。我文档中的任何标题都可以表示一个表格。我怎么知道?
  • 如果 pdf 文档只有一个来源,那么表格的构建方式可能会有所不同。如果你能弄清楚你的代码并注意它。不幸的是,我认为 pdf 文件没有任何正式的“表格”元素,所以这样做可能是你唯一的办法......
  • 谢谢,有道理。我必须根据我的数据制定策略。

标签: python parsing pdf pdfminer


【解决方案1】:

如果你只想从PDF文档中提取表格,那么看看这个答案:How to extract table as text from the PDF using Python?

从那个答案中,我尝试了tabula-py,它对我有用,它可以处理分布在多页 PDF 上的图表。 tabula-py 正确跳过了所有页眉和页脚。之前我曾在同一类型的文档上尝试过 PDFMiner,我遇到了与您提到的相同的问题,有时甚至更糟。

【讨论】:

    【解决方案2】:

    使用 camelot 从 pdf 中提取表格

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2013-06-04
      • 1970-01-01
      • 2021-10-05
      • 2014-10-06
      • 1970-01-01
      相关资源
      最近更新 更多