如何从具有特定行的位置的多个 pdf 中提取文本并存储在 Excel 中?

How to extract text from multiple pdf in a location with specific line and store in Excel?

我在某个位置存储了 100 个 pdf,我想从中提取文本并存储在 excel 下面是pdf图片 在此我想要(存储在第 1 页)

bid no,end date,item category,organisation name 

需要

OEM Average Turnover (Last 3 Years),Years of Past Experience required,MSE Exemption for Years Of Experience
and Turnover,Startup Exemption for Years of Experience
and Turnover,Estimated Bid Value,EMD Required

仅限收货人地址)

如果你想从pdf表格中提取数据到excel,你可以使用tabula https://tabula.technology/。对于这种东西其实已经很不错了

以下代码可能会帮助您入门:

pdf_folder = 'C:\PDF extract\pdf\'
paths = [pdf_folder + fn for fn in os.listdir(pdf_folder) if fn.endswith('.pdf')]

for path in paths:
    listdf = tabula.read_pdf(path, encoding = 'latin1', pages = 'all', nospreadsheet = True,multiple_tables=True)
    path = path.replace('pdf', 'csv')
    df_concat = pd.concat(listdf)
    df_concat.to_csv(path, index = False)

来源:looping through pdf files with tabulizer in python

Tika 是 Python 软件包之一,您可以使用它从 PDF 文件中提取数据。

在下面的示例中,我使用 Tika 和正则表达式来提取这五个数据元素:

  • 投标号
  • 结束日期
  • 项目类别
  • 组织名称
  • 总数量
import re as regex
from tika import parser

parse_entire_pdf = parser.from_file('2022251527199.pdf', xmlContent=True)
for key, values in parse_entire_pdf.items():
    if key == 'content':
        bid_number = regex.search(r'(Bid Number:)\W(GEM\W\d{4}\W[A-Z]\W\d+)', values)
        print(bid_number.group(2))
        GEM/2022/B/1916455

        bid_end_date = regex.search(r'(Bid End Date\WTime)\W(\d{2}-\d{2}-\d{4}\W\d{2}:\d{2}:\d{2})', values)
        print(bid_end_date.group(2))
        21-02-2022 15:00:00

        org_name = regex.search(r'(Organisation Name)\W(.*)', values)
        print(org_name.group(2))
        State Election Commission (sec), Gujarat

        item_category = regex.search(r'(Item Category)\W(.*)', values)
        print(item_category.group(2))
        Desktop Computers (Q2) , Computer Printers (Q2)
 
        total_quantity = regex.search(r'(Total Quantity)\W(\d+)', values)
        print(total_quantity.group(2))
        18

这是将提取的数据写入 CSV 文件的一种方法:

import csv
import re as regex
from tika import parser

document_elements = []

# processing 2 documents 
documents = ['202225114747453.pdf', '2022251527199.pdf']
for doc in documents:
    parse_entire_pdf = parser.from_file(doc, xmlContent=True)
    for key, values in parse_entire_pdf.items():
        if key == 'content':
            bid_number = regex.search(r'(Bid Number:)\W(GEM\W\d{4}\W[A-Z]\W\d+)', values)

            bid_end_date = regex.search(r'(Bid End Date\WTime)\W(\d{2}-\d{2}-\d{4}\W\d{2}:\d{2}:\d{2})', values)

            org_name = regex.search(r'(Organisation Name)\W(.*)', values)

            item_category = regex.search(r'(Item Category)\W(.*)', values)

            total_quantity = regex.search(r'(Total Quantity)\W(\d+)', values)
            
            document_elements.append([bid_number.group(2),
                                      bid_end_date.group(2), 
                                      org_name.group(2), 
                                      item_category.group(2),
                                      total_quantity.group(2)])


with open("out.csv", "w", newline="") as f:
    headerList = ['bid_number', 'bid_end_date', 'org_name', 'item_category', 'total_quantity']
    writer = csv.writer(f)
    writer.writerow(headerList)
    writer.writerows(document_elements)

这是您在评论中要求的附加代码。

import os
import re as regex
from tika import parser

document_elements = []

image_directory = "pdf_files"
image_directory_abspath = os.path.abspath(image_directory)
for dirpath, dirnames, filenames in os.walk(image_directory_abspath):
    for filename in [f for f in filenames if f.endswith(".pdf")]:
        parse_entire_pdf = parser.from_file(os.path.join(dirpath, filename), xmlContent=True)
        for key, values in parse_entire_pdf.items():
            if key == 'content':
                bid_number = regex.search(r'(Bid Number:)\W(GEM\W\d{4}\W[A-Z]\W\d+)', values)

                bid_end_date = regex.search(r'(Bid End Date\WTime)\W(\d{2}-\d{2}-\d{4}\W\d{2}:\d{2}:\d{2})', values)

                org_name = regex.search(r'(Organisation Name)\W(.*)', values)

                item_category = regex.search(r'(Item Category)\W(.*)', values)

                total_quantity = regex.search(r'(Total Quantity)\W(\d+)', values)

                document_elements.append([bid_number.group(2),
                                          bid_end_date.group(2),
                                          org_name.group(2),
                                          item_category.group(2),
                                          total_quantity.group(2)])

with open("out.csv", "w", newline="") as f:
    headerList = ['bid_number', 'bid_end_date', 'org_name', 'item_category', 'total_quantity']
    writer = csv.writer(f)
    writer.writerow(headerList)
    writer.writerows(document_elements)

特别说明: 我注意到有些 PDF 没有 org_name,因此您必须弄清楚如何使用 N/A, None, or Null