PDF文档里的图片提取转文字
最近需要处理一堆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中文语言包