含图片PDF转纯文本遇难题:现有方案效果差求技术建议
优化含图片PDF的纯文本提取方案
核心问题分析
你的现有代码会把所有PDF页面统一转成图片再执行OCR,这对纯扫描型PDF(无原生文本)是合适的,但对包含原生文本的PDF来说完全是绕远路——原生文本可以直接精准提取,转成图片OCR反而会引入识别误差,自然效果差。咱们换个更聪明的思路:先区分PDF页面类型,优先提取原生文本,只有纯扫描的页面才用OCR,同时优化工具链提升效率。
优化思路和实现方案
1. 先判断页面类型:原生文本页 vs 扫描页
我们可以先用工具尝试提取页面的原生文本,如果能提取到有效内容(排除空白或极少字符的情况),就直接用这个文本;只有当提取不到有效内容时,再用OCR处理。
推荐用**PyMuPDF(fitz)**来做原生文本提取,它速度快、精度高,还能轻松获取页面文本的字符数,方便我们判断页面类型。
2. 跳过图片,只保留原生文本
你的需求是忽略无关图片,所以对于有原生文本的页面,直接提取文本即可,完全不需要处理图片;只有纯扫描的页面(没有原生文本),才需要转图片做OCR。
3. 优化OCR流程,避免生成中间文件
现有代码会生成临时的JPG和TXT文件,既占磁盘空间又拖慢速度,我们可以直接在内存中把PDF页面转成图片,再传给pytesseract处理。
优化后的代码示例
import pytesseract as pt import fitz # PyMuPDF from PIL import Image import io import sys def extract_text_from_pdf(pdf_path): doc = fitz.open(pdf_path) for page_num in range(len(doc)): page = doc.load_page(page_num) # 尝试提取原生文本并去除首尾空白 native_text = page.get_text().strip() # 设定阈值判断是否为有效原生文本(可根据需求调整) if len(native_text) > 50: # 原生文本有效,直接保存 with open(f'page{page_num}.text', 'w', encoding='utf-8') as f: f.write(native_text) print(f"Page {page_num}: 成功提取原生文本") else: # 无有效原生文本,视为扫描页,转图片做OCR # 直接在内存生成图片,无需存到磁盘 pix = page.get_pixmap(dpi=200) img_data = pix.tobytes("jpg") img = Image.open(io.BytesIO(img_data)) # 优化OCR参数:指定法语,假设页面为单一文本块 ocr_text = pt.image_to_string(img, lang="fra", config="--psm 6") with open(f'page{page_num}.text', 'w', encoding='utf-8') as f: f.write(ocr_text) print(f"Page {page_num}: 通过OCR处理完成") if __name__ == '__main__': if len(sys.argv) != 2: print("使用方法: python script.py <pdf文件路径>") sys.exit(1) extract_text_from_pdf(sys.argv[1])
额外优化建议
- 调整OCR参数:
--psm 6告诉Tesseract假设页面是一个单一的文本块,适合大多数扫描页;如果是多栏文本,可以试试--psm 3(默认)或者--psm 4。 - 确认语言包:确保你已经安装了法语的Tesseract语言包(
fra),不然OCR会失效。 - 批量处理提速:如果需要处理大量PDF,可以添加多线程来提升整体处理速度。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

