银行和金融机构有众多的金融文档PDF,如贷款申请表、财务报表等。从特定的表格区域或文本区域进行OCR识别,提取诸如客户账号、贷款金额、报告期等关键信息,并用于文件整理后输出表Excel表格文件,有助于金融机构更好地管理客户资料和财务数据。
以下是使用 Python 和飞桨(PaddlePaddle)将 PDF 指定区域自动 OCR 识别并提取数据到 Excel 文件的详细步骤:
一、安装所需的库
bash
pip install pdf2image
pip install paddlepaddle
pip install paddleocr
pip install pandas
pip install openpyxl
二、导入所需的库
python
import pdf2image
from paddleocr import PaddleOCR
import pandas as pd
import os
三、将 PDF 转换为图像
python
def pdf_to_images(pdf_path):
images = pdf2image.convert_from_path(pdf_path)
image_paths = []
for i, image in enumerate(images):
image_path = f'temp_image_{i}.jpg'
image.save(image_path)
image_paths.append(image_path)
return image_paths
代码解释:
pdf2image.convert_from_path(pdf_path):将 PDF 文件转换为图像列表。- 对于每个转换后的图像,将其保存为一个临时的 JPG 文件,并将这些临时文件的路径存储在
image_paths列表中,以便后续使用。
四、使用 PaddleOCR 对指定区域进行 OCR 识别
python
def ocr_on_images(image_paths, x0, y0, x1, y1):
ocr = PaddleOCR()
all_text = []
for image_path in image_paths:
result = ocr.ocr(image_path, cls=False)
for line in result[0]:
# 检查 OCR 结果是否在指定区域内
if x0 <= line[0][0][0] <= x1 and y0 <= line[0][0][1] <= y1:
all_text.append(line[1][0])
return all_text
代码解释:
PaddleOCR():初始化 PaddleOCR 引擎。ocr.ocr(image_path, cls=False):对图像进行 OCR 识别,cls=False表示不进行方向分类。- 对于每个识别结果,检查其位置是否在指定的
(x0, y0, x1, y1)区域内,如果在该区域内,将识别出的文本添加到all_text列表中。
五、处理提取的文本数据(根据实际情况)
假设提取的文本数据可以用换行符分隔:python
def process_text(all_text):
text = '\n'.join(all_text)
return text
代码解释:
'\n'.join(all_text):将提取的文本列表用换行符连接成一个完整的文本字符串。
六、将数据存储到 Excel 文件中
python
def save_to_excel(text, excel_path):
df = pd.DataFrame([text.split('\n')])
df.to_excel(excel_path, index=False, header=False)
代码解释:
pd.DataFrame([text.split('\n')]):将文本按换行符拆分成多行,并存储在一个 DataFrame 中。df.to_excel(excel_path, index=False, header=False):将 DataFrame 中的数据存储到 Excel 文件中,不保存行索引和列名。
七、清理临时图像文件
python
def clean_up(image_paths):
for image_path in image_paths:
os.remove(image_path)
代码解释:
os.remove(image_path):删除临时生成的图像文件,避免占用过多磁盘空间。
八、完整的代码示例
python
import pdf2image
from paddleocr import PaddleOCR
import pandas as pd
import os
def pdf_to_images(pdf_path):
images = pdf2image.convert_from_path(pdf_path)
image_paths = []
for i, image in enumerate(images):
image_path = f'temp_image_{i}.jpg'
image.save(image_path)
image_paths.append(image_path)
return image_paths
def ocr_on_images(image_paths, x0, y0, x1, y1):
ocr = PaddleOCR()
all_text = []
for image_path in image_paths:
result = ocr.ocr(image_path, cls=False)
for line in result[0]:
if x0 <= line[0][0][0] <= x1 and y0 <= line[0][0][1] <= y1:
all_text.append(line[1][0])
return all_text
def process_text(all_text):
text = '\n'.join(all_text)
return text
def save_to_excel(text, excel_path):
df = pd.DataFrame([text.split('\n')])
df.to_excel(excel_path, index=False, header=False)
def clean_up(image_paths):
for image_path in image_paths:
os.remove(image_path)
if __name__ == "__main__":
# 替换为你的 PDF 文件路径
pdf_path = 'example.pdf'
# 替换为你想要保存的 Excel 文件路径
excel_path = 'output.xlsx'
# 指定区域的坐标 (x0, y0, x1, y1)
x0, y0, x1, y1 = 100, 100, 300, 300
image_paths = pdf_to_images(pdf_path)
extracted_text = ocr_on_images(image_paths, x0, y0, x1, y1)
processed_text = process_text(extracted_text)
save_to_excel(processed_text, excel_path)
clean_up(image_paths)
代码解释:
- PDF 转图像:
pdf_to_images(pdf_path):将 PDF 转换为多个图像文件,并存储这些图像的路径。
- OCR 识别:
ocr_on_images(image_paths, x0, y0, x1, y1):使用 PaddleOCR 对图像进行 OCR 识别,并筛选出指定区域内的文本。
- 文本处理:
process_text(all_text):将提取的文本列表组合成一个完整的文本字符串。
- 存储到 Excel:
save_to_excel(text, excel_path):将处理好的文本存储到 Excel 文件。
- 清理:
clean_up(image_paths):删除临时生成的图像文件。
九、注意事项
- 坐标系统:
- 请确保你使用的
(x0, y0, x1, y1)坐标系统与 PaddleOCR 结果的坐标系统一致,可能需要根据不同的工具和库进行适当的调整。
- 请确保你使用的
- OCR 性能:
- PaddleOCR 的性能和准确性可能会受到图像质量、字体、语言等多种因素的影响,对于一些复杂的文档,可能需要对图像进行预处理(如增强、降噪)来提高 OCR 效果。
- 临时文件管理:
- 上述代码使用临时图像文件,在处理完成后会删除这些文件,确保你有足够的磁盘空间和文件权限。
通过上述步骤,你可以使用 Python 和 PaddlePaddle 从 PDF 的指定区域进行 OCR 识别,并将结果存储到 Excel 文件中。你可以根据实际情况调整和优化代码,以适应不同的 PDF 文件和 OCR 需求。
1448

被折叠的 条评论
为什么被折叠?



