Python批量PDF转Word 文字直提与OCR扫描件转换实践
在处理办公文档时,PDF转Word是很常见的需求。相比在线工具普遍存在的页数限制,用Python脚本可以完全本地化地批量处理。本文基于实际代码,介绍文字型PDF直接提取,以及扫描型PDF通过Tesseract OCR识别后写入Word的两种实现方式,并附带批量文件夹转换脚本。一、PDF转Word的两类处理逻辑
PDF文件分为两种:文字型PDF,文字可以选中复制,本质上保存的是一段文本流;扫描型PDF,页面内容是一张图片,文字无法直接复制。针对这两类,Python的处理方式也不同。
文字型PDF建议使用pdfplumber直接提取文本,识别速度快且准确率接近100%。扫描型PDF需要先将页面渲染为图片,再用Tesseract OCR识别文字,最后写入Word。OCR的识别准确率通常取决于图片清晰度和语言包,一般为85%到95%。
二、环境准备
方案一:文字型PDF需要安装如下库:
pip install pdfplumber python-docx
方案二:OCR识别需要额外安装:
pip install pytesseract pdf2image python-docx Pillow
除了Python库,OCR方案还依赖Tesseract OCR引擎。Windows用户可以从GitHub上的UB-Mannheim项目页下载安装包,安装后建议把Tesseract路径配置到环境变量,或者在代码中直接指定exe路径。
三、方案一:文字型PDF直接转Word
使用pdfplumber读取每一页的extract_text(),再用python-docx写入Word文档。每页之间手动插入分页符,保证输出文档的页数与原PDF一致。
import pdfplumber
from docx import Document
from pathlib import Path
def pdf_to_word_text(input_pdf, output_docx):
doc = Document()
with pdfplumber.open(input_pdf) as pdf:
total_pages = len(pdf.pages)
print(f"共 {total_pages} 页,开始转换...")
for i, page in enumerate(pdf.pages):
text = page.extract_text()
if text:
doc.add_paragraph(text)
if i < total_pages - 1:
doc.add_page_break()
print(f"已转换第 {i+1} 页")
doc.save(output_docx)
print(f"\n转换完成: {output_docx}")
如果PDF中还包含表格,可以调用page.extract_tables()提取表格结构,再通过doc.add_table()逐格写入Word表格。注意每个单元格需要把None转为空字符串,否则写入会报错。
def pdf_tables_to_word(input_pdf, output_docx):
doc = Document()
with pdfplumber.open(input_pdf) as pdf:
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for table_idx, table in enumerate(tables):
if table:
doc.add_heading(f"第 {i+1} 页 - 表格 {table_idx+1}", level=2)
word_table = doc.add_table(rows=len(table), cols=len(table))
for row_idx, row in enumerate(table):
for col_idx, cell in enumerate(row):
word_table.cell(row_idx, col_idx).text = str(cell or '')
doc.save(output_docx)
print(f"表格提取完成: {output_docx}")
四、方案二:扫描型PDF通过OCR转Word
扫描件的核心流程是:PDF每页先转为高分辨率图片,然后调用pytesseract.image_to_string识别图片中的文字,最后把识别结果逐段写入Word。DPI设置为300是一个平衡点,既能保证识别质量,又不会让处理时间过长。
import pytesseract
from pdf2image import convert_from_path
from docx import Document
TESSERACT_PATH = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
pytesseract.pytesseract.tesseract_cmd = TESSERACT_PATH
def ocr_pdf_to_word(input_pdf, output_docx, lang='chi_sim+eng'):
doc = Document()
print("正在将 PDF 转为图片...")
images = convert_from_path(input_pdf, dpi=300)
print(f"共 {len(images)} 页")
for i, image in enumerate(images):
print(f"OCR 识别第 {i+1} 页...")
text = pytesseract.image_to_string(image, lang=lang)
doc.add_paragraph(text)
if i < len(images) - 1:
doc.add_page_break()
doc.save(output_docx)
print(f"\nOCR 转换完成: {output_docx}")
lang参数可以组合使用,例如'chi_sim+eng'代表简体中文加英文。如果只处理中文,可以只写'chi_sim'。
五、批量转换文件夹中的所有PDF
实际工作中往往需要转换整个目录下的PDF。可以用Path.glob('*.pdf')遍历文件夹,根据文件类型自动选择OCR或直接提取。输出目录默认为Word文档,不存在时会自动创建。
def batch_pdf_to_word(folder_path, output_dir="Word文档", use_ocr=False):
folder = Path(folder_path)
output = Path(output_dir)
output.mkdir(parents=True, exist_ok=True)
for pdf_file in folder.glob('*.pdf'):
word_file = output / f"{pdf_file.stem}.docx"
if use_ocr:
ocr_pdf_to_word(str(pdf_file), str(word_file))
else:
pdf_to_word_text(str(pdf_file), str(word_file))
print(f"\n批量转换完成! 输出目录: {output_dir}/")
六、常见问题与处理方式
1. OCR识别率低怎么办?
提高dpi参数,例如convert_from_path(input_pdf, dpi=600),分辨率越高识别越准。也可以对图片进行灰度化、二值化预处理,减少背景干扰。另外确认tessdata目录下已安装对应的语言包。
2. 中文识别出来是乱码?
说明Tesseract没有中文语言包。需要下载chi_sim.traineddata文件,放入Tesseract安装目录下的tessdata\文件夹。同时调用时传入lang='chi_sim'。
3. 转换后格式丢失?
OCR方案只能提取文字,无法还原PDF中的字体、图片、表格和排版。如果需要保留完整格式,建议使用Adobe Acrobat或WPS会员版这类专业工具。文字型PDF中的表格可以直接用pdfplumber提取,准确率较高。
七、适用场景总结
文字型PDF使用pdfplumber提取,速度更快,准确率接近100%;扫描型PDF使用Tesseract OCR,识别准确率在85%到95%之间,速度中等;含表格的PDF优先使用pdfplumber.extract_tables()解析。根据PDF类型选择对应方案,可以避免无谓的OCR耗时,也能获得更好的转换结果。这个脚本可以直接集成到自动化办公流程中,用来批量处理合同、报告等文档。
以上两种转换方法覆盖了日常PDF转Word的主要场景,代码可以直接复用。对于需要反复处理大量PDF文件的场景,建议将batch_pdf_to_word封装成命令行或定时任务,进一步提高效率。
Re: Python批量PDF转Word 文字直提与OCR扫描件转换实践
楼主的经验分享很实在,最近正好要处理一批扫描件,OCR那部分直接复制代码试了下,300dpi确实够用,识别效果比在线工具稳定多了。还有个细节想补充:如果PDF里有图片和文字混排,纯文本提取会丢掉图片,需要的话可以用pdfplumber的page.images配合写入Word,不过对排版要求不高的场景,楼主这个方法简洁高效。Re: Python批量PDF转Word 文字直提与OCR扫描件转换实践
楼主这篇实战分享很实用,正好最近在整理一批扫描件。文字型PDF用pdfplumber确实稳,表格提取那段也写得很清楚。想请教一下:扫描件如果遇到页面方向不统一的情况,OCR前需要先做旋转校正吗?另外OCR出来的文本排版会乱,楼主有没有什么办法尽量保留段落结构?Re: Python批量PDF转Word 文字直提与OCR扫描件转换实践
看着很实用,尤其是把文字型和扫描型分开处理这个思路很清楚。以前用在线工具转扫描件经常被页数限制卡住,这个本地批量方案能解决大问题。OCR那部分提到的清晰度和DPI设置确实关键,我之前用Tesseract遇到过识别率不高的情况,调高分辨率会好很多。表格提取那个补充也挺好,有空试试看。
页:
[1]