最近需要处理一堆PDF文档,这堆PDF文档中有图片,并且需要提取出pdf中的图片来识别图片中的文字,老规矩先上代码:
import os
import fitz
import pytesseract
from PIL import Image
# 设置Tesseract OCR引擎的路径(根据你的系统环境修改)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
# 定义函数ocr_first_page_of_pdf,用于对PDF的第一页进行OCR识别
def ocr_first_page_of_pdf(pdf_path, output_image_path, zoom):
try:
# 尝试打开PDF文件
doc = fitz.open(pdf_path)
# 加载PDF的第一页
page = doc.load_page(0)
# 创建一个缩放矩阵,用于缩放页面大小
matrix = fitz.Matrix(zoom, zoom)
# 根据缩放矩阵获取页面的像素映射(图像)
pix = page.get_pixmap(matrix=matrix)
# 将像素映射保存为PNG图片文件
pix.save(output_image_path)
# 使用PIL库打开PNG图片文件
image = Image.open(output_image_path)
# 使用Tesseract OCR引擎对图片进行OCR识别,并指定使用简体中文(chi_sim)
text = pytesseract.image_to_string(image, lang='chi_sim')
# 关闭PDF文档
doc.close()
# 关闭PIL图像对象(尽管在Python中通常不需要显式关闭,但这里为了明确性)
image.close()
# 返回识别到的文本
return text
except Exception as e:
# 如果在OCR过程中发生任何异常,打印错误信息并返回None
print(f"Error processing {pdf_path}: {e}")
return None
# 定义函数process_pdfs_in_folder,用于处理指定文件夹中的PDF文件
def process_pdfs_in_folder(folder_path, output_folder):
# 如果输出文件夹不存在,则创建它
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历指定文件夹中的所有文件
for filename in os.listdir(folder_path):
# 如果文件是以.pdf结尾的
if filename.endswith('.pdf'):
# 构建完整的文件路径
file_path = os.path.join(folder_path, filename)
print(f"正在处理文件: {file_path}") # 打印正在处理的文件路径
try:
# 提取文件名(不包括扩展名)作为基础名
base_name, _ = os.path.splitext(filename)
# 构建输出图片文件的路径
output_image_path = os.path.join(output_folder, f"{base_name}_first_page.png")
# 对PDF文件的第一页进行OCR识别
text = ocr_first_page_of_pdf(file_path, output_image_path, zoom=2.0)
if text is not None:
# 打印识别到的文本(注意:下面的两行代码已被注释掉)
# no_whitespace = re.sub(r"\s", "", text) # 移除所有空白字符(包括空格、制表符等)
# no_newlines_tabs = re.sub(r"[\n\t]", "", no_whitespace) # 移除换行符和制表符
print(text) # 打印识别到的文本(包含所有字符)
except Exception as e:
# 如果在处理过程中发生任何异常,打印错误信息
print(f"处理文件 {file_path} 时发生错误: {e}")
# 调用process_pdfs_in_folder函数,处理指定文件夹中的PDF文件
process_pdfs_in_folder(r'C:\Users\your_folder_name', r'output') # 请将your_folder_name替换为实际的文件夹名
有几点需要注意的地方:
首先我的代码是运行在windows环境上的,所以在前面要声明pytesseract库,即pytesseract库需要知道tesseract.exe的路径以便进行OCR识别
其次在项目下必须要有一个名为output的文件夹用来存放映射后的PDF文件中的图片
最后page = doc.load_page(0)
这里的doc.load_page中的参数是对PDF文档中的指定页面进行操作,0是指第一页
附2024年Tesseract中文库下载最新安装包+OCR中文语言包