如何从PDF文档中提取表格?

4
我正在尝试从PDF文档(例如此示例)中提取表格。该文档不是扫描或图像,因此请重点考虑非OCR解决方案。这里有一个OCR 表格提取的解决方案
我已经尝试过pdf -> html -> 提取表格的方法。但是,上述pdf转换为html后会产生垃圾,可能是由于字体以及该文档不是英语。使用x和y坐标提取pdf不是一个选项,因为该解决方案需要适用于未来的pdf,从上述url下载的pdf将包含表格,但位置不总是相同。

1
PDF文件中没有明确的表格数据,它只包含线条和字符字形,我们倾向于将其解释为表格。因此,您的任务是将我们的人类表格识别能力转化为代码,这是一项相当艰巨的任务。 - mkl
@mkl 所以简而言之,如果这不是一个必须要处理的情况,我最好不要考虑解析这个 PDF? :) - meadhikari
1
我曾经用 PDFMiner 做过类似的事情。你可以基本上获得所有对象及其 x 和 y 位置的流,然后按从上到下、从左到右(至少对于英文)分组,然后根据你对上下文的了解,对单元格结束的位置进行一些智能猜测。这很痛苦,而且每个 PDF 都不同。如果不必解析它,最好不要解析。这个有多频繁发布? - ChrisP
4个回答

5
PDF文件不包含显示的表格数据,只包含线条和字符字形,我们通常将其解释为表格。因此,你的任务是将我们人类的表格识别能力转化为代码,这是一项相当困难的任务。
一般来说,如果您确信未来的PDF文件将以非常相似的方式由相同的软件生成,那么研究文件以寻找易于跟踪的提示以识别各个字段的内容可能是值得时间的。
然而,您特定的文档具有其他缺点:它不包含直接提取文本所需的信息!您可以尝试从Adobe Reader中复制粘贴,但会得到(至少我是这样)WinAnsi范围内的半随机字符。
这是因为文档中的所有字体都声称使用WinAnsiEncoding,即使被引用的字符绝对不是来自WinAnsi字符选择。
因此,在没有OCR的情况下,您的文档无法进行可靠的文本提取!
(尝试从Adobe Reader复制和粘贴通常是测试文本提取是否可行的好方法;Reader的文本提取方法已经发展了许多年,并且已经变得相当不错。如果您无法从Acrobat Reader中提取出任何合理的内容,文本提取将是一项非常困难的任务。)

你能给我指一下方向,如果我想走OCR的路线吗? - meadhikari
1
很遗憾,我自己还没有不得不使用OCR的情况。 - mkl
我也在尝试解决这个问题。有趣的是,我发现自己解析了一个PDF文件,它明显看起来是从HTML/Word文档转换成PDF文件的。当我将其从Acrobat Pro导出为Word文档时,表格格式在输出的“.docx”文件中完全正确。我的问题是,如果没有格式,Acrobat如何完美地提取表格? - amergin
@aemergin a 原帖中提供的示例文件未包含直接文本提取所需的信息,但您的文件可能包含... b Acrobat具有OCR模块,如果需要可以应用OCR... c Acrobat如何提取结构信息并不清楚。 可能您的PDF包含其他标记,可能Acrobat知道生成您的PDF的程序如何呈现表格,可能它应用通用人工智能来识别表格... - mkl

4

从PDF文档中提取表格非常困难,因为PDF不包含语义层。

Camelot

您可以尝试使用camelot,甚至可以与其Web界面excalibur结合使用:

>>> import camelot
>>> tables = camelot.read_pdf('foo.pdf')
>>> tables
<TableList n=1>
>>> tables.export('foo.csv', f='csv', compress=True) # json, excel, html, markdown, sqlite
>>> tables[0]
<Table shape=(7, 7)>
>>> tables[0].parsing_report
{
    'accuracy': 99.02,
    'whitespace': 12.24,
    'order': 1,
    'page': 1
}
>>> tables[0].to_csv('foo.csv') # to_json, to_excel, to_html, to_markdown, to_sqlite
>>> tables[0].df # get a pandas DataFrame!

另请参阅

Tabula

tabula可以通过以下方式安装

pip install tabula-py

但是它需要Java,因为tabula-py只是Java项目的包装器。

使用方法如下:

import tabula

# Read pdf into list of DataFrame
dfs = tabula.read_pdf("test.pdf", pages='all')

另请参阅:

AWS Textract

我最近没有尝试过,但AWS Textract声称:

Amazon Textract可以从文档中提取表格,并提取表格内的单元格、合并单元格和列标题。

PdfPlumber

pdfplubmer表格提取方法

import pdfplumber

pdf = pdfplumber.open("example.pdf")
page = pdf.pages[0]
page.extract_table()

另请参阅


3

你尝试过在OP提供的文件上使用Tabula吗?正如我在答案中提到的,该文档不包含直接文本提取所需的信息,即使用PDF语法编码的信息进行文本提取,而Tabula依赖于PDFBox进行文本提取,后者仅使用此类信息。因此,我怀疑Tabula现在是否有帮助。 - mkl
在你的评论之后,我使用tabula将第一个表格的信息提取为csv。尽管文本已更改(可能是由于编码),但似乎它正在工作。尽管如此,我认为我没有足够的技术知识来给出更高级的答案。 - panchtox
1
嗯,文本很可能已经改变了,因为该文档缺少直接提取文本所需的信息,而代替这些信息的假设很可能是错误的。 - mkl
@franaf:是的!Tabula每周都在变得越来越好... :-) - Kurt Pfeifle

0

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