什么是从pdf提取数据的最佳方法

时间:2019-09-14 21:42:05

标签: python node.js pdf pdf-scraping

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

enter image description here

我愿意使用nodejs,python或任何其他有效方法。我对python和nodejs知之甚少。 我尝试将python与这段代码一起使用

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中提取采购历史记录的最佳方法是什么?

6 个答案:

答案 0 :(得分:1)

pdfplumber 是最好的选择。 [Reference]

安装

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())

答案 1 :(得分:0)

很久以前,我做了类似的事情来取消成绩。我发现最简单(不是很漂亮)的解决方案是将pdf转换为html,然后解析html。

为此,我使用了pdf2text / pdf2html(https://pypi.org/project/pdf-tools/)和html。
我还使用了编解码器,但不记得确切的原因。

一个简短而肮脏的摘要:

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即可轻松提取信息。

希望对您有帮助!

编辑:注释代码

EDIT2: 以下代码正在打印数据

# 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();

答案 2 :(得分:0)

好。我从opait.com帮助开发此商业产品。 我将您输入的PDF划分为如下几个区域:

enter image description here

还有您拥有的表:

enter image description here

大约2分钟后,我就可以从一个和1000个文档中提取它了。请注意,此图像是日志视图,并将该数据导出为CSV。所有蓝色的“链接”都是实际提取的数据,并实际链接回PDF,因此您可以查看从何处。输出可以是XML或JSON或其他格式。在该屏幕截图中看到的是日志视图,所有视图均为CSV格式(如果一个PDF在一个PDF中包含1000个这些文档,则所有视图都为CSV格式的一个主要属性,每个由记录ID链接的表的其他属性)。

同样,我会协助您开发此产品,但您可以要求完成。我提取了整个表格,但也提取了所有其他重要字段。

enter image description here

答案 3 :(得分:0)

PDFTron,我工作的公司拥有一个全自动的PDF到HTML输出解决方案。

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

这是您提供的文件的HTML输出的屏幕截图。输出既包含HTML表,又包含两者之间的可重排文本内容。

enter image description here

输出为标准XML HTML,因此您可以轻松解析/处理HTML表。

答案 4 :(得分: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页是免费的。

答案 5 :(得分:0)

这是 IntelliGet 中的四行脚本

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