最佳的从PDF中提取数据的方法是什么?

7
我有成千上万个PDF文件需要提取数据。这是一个示例pdf。我想从示例PDF中提取此信息。

enter image description here

我可以使用Node.js、Python或其他有效的方法。我对Python和Node.js的了解很少。 我尝试使用以下代码:

import PyPDF2

try:
   pdfFileObj = open('test.pdf', 'rb')
   pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
   pageNumber = pdfReader.numPages
   page = pdfReader.getPage(0)
   print(pageNumber)

   pagecontent = page.extractText()
   print(pagecontent)
except Exception as e:
   print(e)

但我卡在如何找到采购历史记录上了。从PDF中提取采购历史记录的最佳方法是什么?

有商业解决方案可以做到这一点,事实上我们实际上有一个处理这些确切文件的模板。大多数免费提供的应用程序在设置标记和识别流动文件中可能出现的位置方面能力不足。如果您想要一个商业应用程序的答案,我很乐意发布它。 - Kevin Brown
@KevinBrown 请发布它。 - e.iluf
6个回答

2

pdfplumber 是最好的选项。[参考资料]

安装

pip install pdfplumber

提取所有文本
import pdfplumber
path = 'path_to_pdf.pdf'
with pdfplumber.open(path) as pdf:
    for  page  in pdf.pages:
        print(page.extract_text())

2
我很久以前做过类似于“刮”的事情,用来获取我的成绩。我找到的最简单(不太美观)的解决方案是将pdf转换为html,然后解析html。
为此,我使用了pdf2text/pdf2html (https://pypi.org/project/pdf-tools/) 和 html。 我还使用了codecs,但不记得具体原因了。
一个快速而肮脏的总结:
from lxml import html
import codecs
import os

# First convert the pdf to text/html
# You can skip this step if you already did it
os.system("pdf2txt -o file.html file.pdf")
# Open the file and read it
file = codecs.open("file.html", "r", "utf-8")
data = file.read()
# We know we're dealing with html, let's load it
html_file = html.fromstring(data)
# As it's an html object, we can use xpath to get the data we need
# In the following I get the text from <div><span>MY TEXT</span><div>
extracted_data = html_file.xpath('//div//span/text()')
# It returns an array of elements, let's process it
for elm in extracted_data:
    # Do things
file.close()

只需检查pdf2text或pdf2html的结果,然后使用xpath轻松提取您的信息。
希望能对您有所帮助!
编辑:评论代码
编辑2: 以下代码正在打印您的数据。
# Assuming you're only giving the page 4 of your document
# os.system("pdf2html test-page4.pdf > test-page4.html")

from lxml import html
import codecs
import os

file = codecs.open("test-page4.html", "r", "utf-8")
data = file.read()
html_file = html.fromstring(data)
# I updated xpath to your need
extracted_data = html_file.xpath('//div//p//span/text()')
for elm in extracted_data:
    line_elements = elm.split()
    # Just observed that what you need starts with a number
    if len(line_elements) > 0 and line_elements[0].isdigit():
        print(line_elements)
file.close();

你能帮忙解释一下这段代码在做什么吗?似乎这段代码首先尝试使用os.system将pdf文件转换为文本? - e.iluf
我已经为代码做了注释,如果你有具体问题可以直接问。是的,先转换再解析。 - ZHAJOR
我遇到了这个错误 >> FileNotFoundError: [Errno 2] No such file or directory: 'file.html'。看起来它没有将pdf文件转换为html。 - e.iluf
看起来这个工具不再以同样的方式工作了。 我在我的回复中添加了一段可用的代码。 唯一的手动步骤是将您的pdf文件的第4页提取到名为test-page4.pdf的文件中。 - ZHAJOR

0

这是在IntelliGet中的四行脚本

{ start = IsSubstring("CAGE   Contract Number",Line(-2));  
  end = IsEqual(0, Length(Line(1)));
  { start = 1;
    output = Line(0);
  }
}

0

好的。我正在协助opait.com的商业产品开发。 我已经将您提供的PDF文件进行了分区,如下所示:

enter image description here

还有你所拥有的表格:

enter image description here

大约2分钟左右,我就可以从这个文件和1000个类似的文件中提取出这些内容。请注意,此图像是日志视图,并将数据导出为CSV格式。所有蓝色“链接”都是实际提取的数据,并且实际上链接回PDF,以便您可以看到其来源。输出也可以是XML或JSON或其他格式。您在屏幕截图中看到的是日志视图,所有内容都以CSV格式呈现(一个用于主属性,其他用于每个表格,由记录ID链接,如果您有一个PDF包含1000个这样的文档)。

再次说明,我协助开发此产品,但您所要求的可以完成。我提取了您的整个表格,还提取了其他重要字段。

enter image description here


0

PDFTron是我所在公司的一家完全自动化的PDF转HTML输出解决方案提供商。

您可以在此在线尝试使用: https://www.pdftron.com/pdf-tools/pdf-table-extraction

以下是您提供的文件的HTML输出屏幕截图。输出内容包含HTML表格和可重排列的文本内容。

enter image description here

输出是标准的 XML HTML,因此您可以轻松解析/操作 HTML 表格。


0

我在制造PDFTables的公司工作。 PDFTables API可以帮助您解决此问题,并一次转换所有PDF文件。它是一个简单的基于Web的API,因此可以从任何编程语言中调用。您需要在PDFTables.com上创建一个帐户,然后使用此处一个示例语言的脚本:https://pdftables.com/pdf-to-excel-api。这是一个使用Python的示例:

import pdftables_api
import os

c = pdftables_api.Client('MY-API-KEY')

file_path = "C:\\Users\\MyName\\Documents\\PDFTablesCode\\"

for file in os.listdir(file_path):
    if file.endswith(".pdf"):
        c.xlsx(os.path.join(file_path,file), file+'.xlsx')

该脚本会查找文件夹中所有扩展名为'.pdf'的文件,然后将每个文件转换为XLSX格式。您可以将格式更改为'.csv','.html'或'.xml'。前75页免费。

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