import os import argparse import pdfplumber from docx import Document from pdf2image import convert_from_path import pytesseract # 配置Tesseract路径(Windows用户需修改为自己的安装路径) pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def pdf_to_word(pdf_path, output_path=None, use_ocr=False): """ PDF转Word核心函数 :parampdf_path: PDF文件路径 :paramoutput_path: Word输出路径(默认同目录同名) :paramuse_ocr: 是否启用OCR(处理扫描件) """ #校验文件是否存在 ifnot os.path.exists(pdf_path): raiseFileNotFoundError(f"未找到文件:{pdf_path}") #默认输出路径 ifoutput_path is None: output_path= os.path.splitext(pdf_path)[0] + ".docx" #创建Word文档 doc= Document() print(f"开始转换:{pdf_path}") try: ifnot use_ocr: #纯文本PDF处理 withpdfplumber.open(pdf_path) as pdf: total_pages= len(pdf.pages) forpage_num, page in enumerate(pdf.pages, 1): text= page.extract_text() iftext: doc.add_heading(f"第{page_num}页",level=2) doc.add_paragraph(text) doc.add_page_break() else: print(f"第{page_num}页无文本(建议启用OCR重试)") print(f"进度:{page_num}/{total_pages}") else: #扫描件PDF处理(OCR) images= convert_from_path(pdf_path) total_pages= len(images) forpage_num, img in enumerate(images, 1): text= pytesseract.image_to_string(img, lang='chi_sim') doc.add_heading(f"第{page_num}页",level=2) doc.add_paragraph(text) doc.add_page_break() print(f"进度:{page_num}/{total_pages}") #保存文档 doc.save(output_path) print(f"转换完成!文件保存至:{output_path}") returnoutput_path exceptException as e: raiseRuntimeError(f"转换失败:{str(e)}") def main(): #命令行参数解析 parser= argparse.ArgumentParser(description='Python PDF转Word工具(支持纯文本/扫描件)') parser.add_argument('pdf_file',help='PDF文件路径') parser.add_argument('-o','--output', help='Word输出路径(可选)') parser.add_argument('--ocr',action='store_true', help='启用OCR(处理扫描件)') args= parser.parse_args() try: pdf_to_word(args.pdf_file,args.output, args.ocr) exceptException as e: print(f"错误:{e}") if __name__ == "__main__": #运行示例: #纯文本PDF:python pdf2word.py 文档.pdf #扫描件PDF:python pdf2word.py 扫描件.pdf --ocr #指定输出路径:python pdf2word.py 文档.pdf -o 结果.docx main() |