查看: 253|回复: 0

Python批量PDF转Word 文字直提与OCR扫描件转换实践

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在处理办公文档时,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需要安装如下库:
  1. pip install pdfplumber python-docx
复制代码
方案二:OCR识别需要额外安装:
  1. 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一致。
  1. import pdfplumber
  2. from docx import Document
  3. from pathlib import Path
  4. def pdf_to_word_text(input_pdf, output_docx):
  5.     doc = Document()
  6.     with pdfplumber.open(input_pdf) as pdf:
  7.         total_pages = len(pdf.pages)
  8.         print(f"共 {total_pages} 页,开始转换...")
  9.         for i, page in enumerate(pdf.pages):
  10.             text = page.extract_text()
  11.             if text:
  12.                 doc.add_paragraph(text)
  13.             if i < total_pages - 1:
  14.                 doc.add_page_break()
  15.             print(f"已转换第 {i+1} 页")
  16.     doc.save(output_docx)
  17.     print(f"\n转换完成: {output_docx}")
复制代码
如果PDF中还包含表格,可以调用page.extract_tables()提取表格结构,再通过doc.add_table()逐格写入Word表格。注意每个单元格需要把None转为空字符串,否则写入会报错。
  1. def pdf_tables_to_word(input_pdf, output_docx):
  2.     doc = Document()
  3.     with pdfplumber.open(input_pdf) as pdf:
  4.         for i, page in enumerate(pdf.pages):
  5.             tables = page.extract_tables()
  6.             for table_idx, table in enumerate(tables):
  7.                 if table:
  8.                     doc.add_heading(f"第 {i+1} 页 - 表格 {table_idx+1}", level=2)
  9.                     word_table = doc.add_table(rows=len(table), cols=len(table[0]))
  10.                     for row_idx, row in enumerate(table):
  11.                         for col_idx, cell in enumerate(row):
  12.                             word_table.cell(row_idx, col_idx).text = str(cell or '')
  13.     doc.save(output_docx)
  14.     print(f"表格提取完成: {output_docx}")
复制代码

四、方案二:扫描型PDF通过OCR转Word
扫描件的核心流程是:PDF每页先转为高分辨率图片,然后调用pytesseract.image_to_string识别图片中的文字,最后把识别结果逐段写入Word。DPI设置为300是一个平衡点,既能保证识别质量,又不会让处理时间过长。
  1. import pytesseract
  2. from pdf2image import convert_from_path
  3. from docx import Document
  4. TESSERACT_PATH = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
  5. pytesseract.pytesseract.tesseract_cmd = TESSERACT_PATH
  6. def ocr_pdf_to_word(input_pdf, output_docx, lang='chi_sim+eng'):
  7.     doc = Document()
  8.     print("正在将 PDF 转为图片...")
  9.     images = convert_from_path(input_pdf, dpi=300)
  10.     print(f"共 {len(images)} 页")
  11.     for i, image in enumerate(images):
  12.         print(f"OCR 识别第 {i+1} 页...")
  13.         text = pytesseract.image_to_string(image, lang=lang)
  14.         doc.add_paragraph(text)
  15.         if i < len(images) - 1:
  16.             doc.add_page_break()
  17.     doc.save(output_docx)
  18.     print(f"\nOCR 转换完成: {output_docx}")
复制代码
lang参数可以组合使用,例如'chi_sim+eng'代表简体中文加英文。如果只处理中文,可以只写'chi_sim'。

五、批量转换文件夹中的所有PDF
实际工作中往往需要转换整个目录下的PDF。可以用Path.glob('*.pdf')遍历文件夹,根据文件类型自动选择OCR或直接提取。输出目录默认为Word文档,不存在时会自动创建。
  1. def batch_pdf_to_word(folder_path, output_dir="Word文档", use_ocr=False):
  2.     folder = Path(folder_path)
  3.     output = Path(output_dir)
  4.     output.mkdir(parents=True, exist_ok=True)
  5.     for pdf_file in folder.glob('*.pdf'):
  6.         word_file = output / f"{pdf_file.stem}.docx"
  7.         if use_ocr:
  8.             ocr_pdf_to_word(str(pdf_file), str(word_file))
  9.         else:
  10.             pdf_to_word_text(str(pdf_file), str(word_file))
  11.     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封装成命令行或定时任务,进一步提高效率。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-28 13:06 , Processed in 0.021795 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部