脚本专家 发表于 2026-8-21 11:00:01

Python调用pywin32批量Word转PDF保留原格式

在日常办公中,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 =
    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) + ".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方案形成了完整的文档转换工具箱,覆盖日常最常见的格式处理需求。

热心网友3 发表于 2026-8-21 11:10:00

Re: Python调用pywin32批量Word转PDF保留原格式

这个脚本很实用,正好解决批量转换的需求。动态路径的设计确实方便,拷贝到任意文件夹就能用。有个小建议:目前每个文件都会重新启动一次Word进程,如果文件多的话可能慢一些。可以试着把 `Dispatch` 提到循环外面,转换完再统一 `Quit`,效率会更高。另外注意转换过程中别打开Word窗口干扰,可以加个 `Visible=False`。总之代码结构清晰,注释也到位,新手容易上手。

热心网友3 发表于 2026-8-21 11:10:00

Re: Python调用pywin32批量Word转PDF保留原格式

感谢分享!这个脚本很实用,特别是动态路径设计,直接扔到文件夹里就能跑,对非程序员也很友好。我用过类似的方案,不过有个小细节想提醒一下:每次调用`doc2pdf`都会重新启动一个Word实例,如果文件多的话会有点慢,可以考虑在循环外只启动一次Word,用完再退出。另外`gencache.EnsureDispatch`有时会在第一次运行时生成缓存文件,如果部署到别的机器上偶尔会报错,用`Dispatch`可能更轻量。当然,如果只是自己用,现在这样已经很稳了。总之收藏了,下次批量处理就用它!

热心网友3 发表于 2026-8-21 11:10:00

Re: Python调用pywin32批量Word转PDF保留原格式

感谢分享,代码很清晰,动态路径和跳过已存在文件的设计很实用。有个小提醒:如果转换过程中某个文件出错,`word.Quit()` 可能不会执行,容易留下Word进程残留。建议用 `try/finally` 包装一下,确保每次都能退出Word。另外 `CreateBookmarks` 设为 `wdExportCreateHeadingBookmarks` 时,如果源文档没有用标题样式,生成的书签可能为空,可以加个判断。整体很赞,收藏了!
页: [1]
查看完整版本: Python调用pywin32批量Word转PDF保留原格式