在 Python 中提取 PDF 文件的文本和表格
Posted
技术标签:
【中文标题】在 Python 中提取 PDF 文件的文本和表格【英文标题】:Extract text and tables of a PDF file in Python 【发布时间】:2021-11-14 15:18:22 【问题描述】:我正在寻找一种从 PDF 文件中提取文本和表格的解决方案。虽然有些包很适合提取文本,但它们不足以提取表格。
一种解决方案是使用 Azure 表单识别器布局模型,但是当我们混合使用文本和表格时它会失败,特别是当表格是一种文本格式并且它们将表格和文本的内容混合在一起时(请参阅 Azure Form识别码https://github.com/Azure-Samples/cognitive-services-quickstart-code/blob/master/python/FormRecognizer/rest/python-train-extract.md)。
我也试过 pypdf2 和 pdfplumber;这是pypdf2的代码:
import PyPDF2
data_path = "directory/to/pdf/files"
texts = []
for fp in os.listdir(data_path):
pdfFileObj = open(os.path.join(data_path, fp), 'rb')
print(pdfFileObj)
#
pdfreader=PyPDF2.PdfFileReader(pdfFileObj)
#
count=pdfreader.numPages
#
text = " "
for i in range(count):
page = pdfreader.getPage(i)
text += page.extractText()
texts.extend([text])
首先,pypdf2 对某些 pdf 文件效果不错,但它会失败并且不会保留某些 pdf 的单词之间的空格,例如(来自https://www.researchgate.net/publication/342920307_Using_Topic_Modeling_Methods_for_Short-Text_Data_A_Comparative_Analysis 的 pdf 文件):
其次,如果页面中存在表格,我如何提取表格? pdfplumber 可以使用 extract_text() 和 extract_table() cmets 提取文本和表格。它无法为某些文档保留单词之间的空格。当我们有经验的双列pdf文件时,它也会失败。
Tabula 是另一种选择,但我从他们的网站https://github.com/tabulapdf/tabula 看到的表格很好。我的最终问题是从给定单列或双列页面的 pdf 文件中提取内容、文本和表格的最佳做法是什么。
【问题讨论】:
您可以尝试免费订阅的 ww.algodocs.com。使用 algodocs,即使质量很差,您也可以从系统生成的 pdf 和扫描图像中提取文本和表格。见algodocs.com/blog/… 感谢 Zhavat,很棒的工具,但看起来它不是开源工具,并且没有可用的 python 源代码。 【参考方案1】:答案取决于问题是通用的还是特定于单个表单的。您的方法对于一般情况是合理的,但会有变化。如果您有一个 pdf 表单,它是在每次迭代中使用不同数据创建的单个表单或报告,请考虑将表单从 pdf 转换为 postscript,然后查看是否可以解析 postscript。
有两个实用程序可以做到这一点:pdf2ps 和 pdftops 分别尝试。如果您知道一些后记,这种方法可能会受益。运气好的话,所需的字段可能是简单的文本字符串。值得一试。
【讨论】:
感谢您的回答,是否可以添加一些python示例代码来尝试如何将pdf转换为postscript? ***.com/questions/45104505/…: from subprocess import call call(["pdf2ps", "input.pdf", "output.eps"]) 实用程序从命令行运行。 @SamS 提供了一种来自 python 的方法。您还可以编写一个 shell 脚本来处理文件并将输出通过管道传输到您的 python 程序中。以上是关于在 Python 中提取 PDF 文件的文本和表格的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 解析 PDF - 提取格式化文本和纯文本 [关闭]
从Txt,PDf,Google云端硬盘中的Doc文件中提取电子邮件地址
在python中使用PDFMiner从PDF文件中提取文本?
从 PDF 中提取文本 - 所有页面和输出 - 使用 Python 的文件