查看: 197|回复: 3

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

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在日常办公中,Word转PDF是高频需求:收集多份Word文档需要合并成PDF发给客户,标书论文需要以PDF提交,或者希望PDF自动生成书签导航。如果逐个用Word另存为,效率太低。利用Python的pywin32库调用Microsoft Word的COM接口,可以批量完成转换,且能够保留原始排版、字体、表格、图片以及标题书签。本文给出一个完全动态路径的脚本,复制到任意文件夹即可运行,自动将该目录下所有.doc和.docx文件转换为PDF,并输出到子文件夹。

环境准备

脚本依赖pywin32,在Windows终端中通过阿里云镜像安装:
  1. pip install pywin32 -i https://mirrors.aliyun.com/pypi/simple/
复制代码

安装后,Python就可以通过win32com.client模块调用Word的COM组件,从而控制Word应用程序完成导出操作。

完整代码
  1. # -*- coding: utf-8 -*-
  2. '''
  3. Python批量将Word文件(DOC/DOCX)转为PDF文件
  4. 功能:自动识别当前目录下所有Word文档,调用本地Word转为PDF
  5. '''
  6. import os
  7. from win32com.client import Dispatch, constants, gencache
  8. def doc2pdf(word_file, pdf_file):
  9.     '''
  10.     单个Word转PDF
  11.     word_file: Word文件完整路径
  12.     pdf_file: 输出PDF完整路径
  13.     '''
  14.     word = gencache.EnsureDispatch('Word.Application')
  15.     doc = word.Documents.Open(word_file, ReadOnly=1)
  16.     # 导出为PDF(关键参数)
  17.     doc.ExportAsFixedFormat(pdf_file,
  18.                             constants.wdExportFormatPDF,
  19.                             Item=constants.wdExportDocumentWithMarkup,
  20.                             CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
  21.     word.Quit(constants.wdDoNotSaveChanges)
  22.     print(f'转换成功:{os.path.basename(word_file)} -> {os.path.basename(pdf_file)}')
  23. def convert_word_in_folder(input_dir, output_dir):
  24.     '''
  25.     批量转换文件夹内所有Word文档
  26.     input_dir: 包含Word文件的目录
  27.     output_dir: PDF输出目录
  28.     '''
  29.     if not os.path.exists(input_dir):
  30.         print(f'输入目录不存在:{input_dir}')
  31.         return
  32.     files = os.listdir(input_dir)
  33.     # 不区分大小写过滤 .doc 和 .docx
  34.     word_files = [f for f in files if f.lower().endswith((".doc", ".docx"))]
  35.     if not word_files:
  36.         print('未找到任何Word文档(.doc 或 .docx)')
  37.         return
  38.     os.makedirs(output_dir, exist_ok=True)
  39.     print(f'找到 {len(word_files)} 个Word文件,开始转换...')
  40.     for word_file in word_files:
  41.         full_input = os.path.join(input_dir, word_file)
  42.         base_name = os.path.splitext(word_file)[0] + ".pdf"
  43.         full_output = os.path.join(output_dir, base_name)
  44.         # 跳过已存在的PDF(避免重复转换)
  45.         if os.path.exists(full_output):
  46.             print(f'已跳过(文件已存在):{base_name}')
  47.             continue
  48.         try:
  49.             doc2pdf(full_input, full_output)
  50.         except Exception as e:
  51.             print(f'转换 {word_file} 时出错:{e}')
  52.     print('所有Word文档转换完成!')
  53. if __name__ == "__main__":
  54.     # ---------- 全部使用动态路径 ----------
  55.     script_dir = os.path.dirname(os.path.abspath(__file__))
  56.     # 输入目录:默认使用脚本所在目录(把你的Word文档放这里)
  57.     docpath = script_dir
  58.     # 输出目录:在脚本所在目录下新建 'pdf_output' 文件夹
  59.     pdfpath = os.path.join(script_dir, 'pdf_output')
  60.     convert_word_in_folder(docpath, pdfpath)
复制代码

代码关键点解析

1. 动态路径设计
  1. script_dir = os.path.dirname(os.path.abspath(__file__))
复制代码

通过__file__获取当前脚本的绝对路径,再取出目录。这样脚本放在哪个文件夹,就处理哪个文件夹里的Word文档。输出目录固定为脚本目录下的pdf_output子文件夹,符合“用过即走”的轻量工具定位。

2. 核心转换函数ExportAsFixedFormat
  1. doc.ExportAsFixedFormat(pdf_file,
  2.                         constants.wdExportFormatPDF,
  3.                         Item=constants.wdExportDocumentWithMarkup,
  4.                         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未安装或安装不完整。执行以下命令重新安装并升级:
  1. 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方案形成了完整的文档转换工具箱,覆盖日常最常见的格式处理需求。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-8-21 13:31 , Processed in 0.024825 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部