在日常办公中,Word转PDF是高频需求:收集多份Word文档需要合并成PDF发给客户,标书论文需要以PDF提交,或者希望PDF自动生成书签导航。如果逐个用Word另存为,效率太低。利用Python的pywin32库调用Microsoft Word的COM接口,可以批量完成转换,且能够保留原始排版、字体、表格、图片以及标题书签。本文给出一个完全动态路径的脚本,复制到任意文件夹即可运行,自动将该目录下所有.doc和.docx文件转换为PDF,并输出到子文件夹。
环境准备
脚本依赖pywin32,在Windows终端中通过阿里云镜像安装:
- pip install pywin32 -i https://mirrors.aliyun.com/pypi/simple/
复制代码
安装后,Python就可以通过win32com.client模块调用Word的COM组件,从而控制Word应用程序完成导出操作。
完整代码
- # -*- coding: utf-8 -*-
- '''
- Python批量将Word文件(DOC/DOCX)转为PDF文件
- 功能:自动识别当前目录下所有Word文档,调用本地Word转为PDF
- '''
- import os
- from win32com.client import Dispatch, constants, gencache
- def doc2pdf(word_file, pdf_file):
- '''
- 单个Word转PDF
- word_file: Word文件完整路径
- pdf_file: 输出PDF完整路径
- '''
- word = gencache.EnsureDispatch('Word.Application')
- doc = word.Documents.Open(word_file, ReadOnly=1)
- # 导出为PDF(关键参数)
- doc.ExportAsFixedFormat(pdf_file,
- constants.wdExportFormatPDF,
- Item=constants.wdExportDocumentWithMarkup,
- CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
- word.Quit(constants.wdDoNotSaveChanges)
- print(f'转换成功:{os.path.basename(word_file)} -> {os.path.basename(pdf_file)}')
- def convert_word_in_folder(input_dir, output_dir):
- '''
- 批量转换文件夹内所有Word文档
- input_dir: 包含Word文件的目录
- output_dir: PDF输出目录
- '''
- if not os.path.exists(input_dir):
- print(f'输入目录不存在:{input_dir}')
- return
- files = os.listdir(input_dir)
- # 不区分大小写过滤 .doc 和 .docx
- word_files = [f for f in files if f.lower().endswith((".doc", ".docx"))]
- if not word_files:
- print('未找到任何Word文档(.doc 或 .docx)')
- return
- os.makedirs(output_dir, exist_ok=True)
- print(f'找到 {len(word_files)} 个Word文件,开始转换...')
- for word_file in word_files:
- full_input = os.path.join(input_dir, word_file)
- base_name = os.path.splitext(word_file)[0] + ".pdf"
- full_output = os.path.join(output_dir, base_name)
- # 跳过已存在的PDF(避免重复转换)
- if os.path.exists(full_output):
- print(f'已跳过(文件已存在):{base_name}')
- continue
- try:
- doc2pdf(full_input, full_output)
- except Exception as e:
- print(f'转换 {word_file} 时出错:{e}')
- print('所有Word文档转换完成!')
- if __name__ == "__main__":
- # ---------- 全部使用动态路径 ----------
- script_dir = os.path.dirname(os.path.abspath(__file__))
- # 输入目录:默认使用脚本所在目录(把你的Word文档放这里)
- docpath = script_dir
- # 输出目录:在脚本所在目录下新建 'pdf_output' 文件夹
- pdfpath = os.path.join(script_dir, 'pdf_output')
- convert_word_in_folder(docpath, pdfpath)
复制代码
代码关键点解析
1. 动态路径设计
- script_dir = os.path.dirname(os.path.abspath(__file__))
复制代码
通过__file__获取当前脚本的绝对路径,再取出目录。这样脚本放在哪个文件夹,就处理哪个文件夹里的Word文档。输出目录固定为脚本目录下的pdf_output子文件夹,符合“用过即走”的轻量工具定位。
2. 核心转换函数ExportAsFixedFormat
- doc.ExportAsFixedFormat(pdf_file,
- constants.wdExportFormatPDF,
- Item=constants.wdExportDocumentWithMarkup,
- CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
复制代码
这是Word自身的导出方法,各参数含义如下:
- wdExportFormatPDF:指定输出为PDF格式,对应数值17。
- Item=wdExportDocumentWithMarkup:导出包含批注的文档内容。如果只需要正文,可改为constants.wdExportDocumentContent。
- CreateBookmarks=wdExportCreateHeadingBookmarks:根据Word中的标题样式自动生成PDF书签,这样生成的PDF左侧导航栏可以直接跳转章节。
如果需要输出XPS格式,只需将wdExportFormatPDF替换为constants.wdExportFormatXPS,代码逻辑不变。
3. 自动跳过已存在的PDF
脚本在转换前检查输出文件是否已存在,如果存在则跳过,避免重复转换,也能在意外中断后继续批量处理,节省时间。
4. 双格式支持
通过f.lower().endswith((".doc", ".docx"))过滤文件,不区分大小写,兼容旧版.doc和新版.docx。
常见问题排查
如果运行时报错:ImportError: No module named win32com.client,通常是因为pywin32未安装或安装不完整。执行以下命令重新安装并升级:
- pip install --upgrade pywin32 -i https://mirrors.aliyun.com/pypi/simple/
复制代码
安装完成后重启Python环境即可正常导入。注意该方案依赖本机已安装Microsoft Word,因为它通过COM接口调用Word应用程序,Word版本越高兼容性越好。
总结
这个不到60行的脚本实现了Word批量转PDF,核心优势在于:
- 保留原文档格式:字体、段落、表格、图片均以Word渲染效果输出;
- 自动生成书签:便于PDF阅读器导航;
- 动态路径:免配置,随放随用;
- 支持.doc和.docx双格式。
在办公自动化场景中,PDF转图片、PPT转PDF、Word转PDF这三类需求经常同时出现,本文给出的pywin32方案与之前介绍的PyMuPDF、comtypes方案形成了完整的文档转换工具箱,覆盖日常最常见的格式处理需求。 |