日常整理合同、简历、报告、标书时,我们经常需要把 Word 转成 PDF:防止内容被篡改、保证排版不跑偏、方便分发和打印。但在线工具要么有水印、要么限速、要么泄露隐私,手动转换又慢又累。
今天给大家带来一款本地离线、无水印、免费高效的 Python 批量转换脚本,基于 Word 原生接口导出,格式 100% 还原,不修改原文件,小白复制粘贴就能用。
一、功能亮点(比在线工具更安全、更好用)
市面上在线转换坑点多:隐私风险、格式错乱、加水印、收费。这款脚本纯本地运行,优势一目了然:
| 本地离线转换 | |
| 递归批量扫描 | |
| 原生格式保真 | |
| 同名自动覆盖 | |
| 静默后台运行 | |
| 成功失败统计 |
二、零基础小白教程(全新电脑也能操作)
没装过 Python、不会写代码也没关系,跟着 5 步走,全程复制粘贴,1 分钟配置完成。
第 1 步:安装 Python
1.打开 Python 官网:https://www.python.org/downloads/ 2.点击 Download Python(3.8 及以上版本均可) 3.运行安装包 ⚠️ 关键:安装界面底部一定要勾选 Add Python to PATH,再点 Install Now
第 2 步:安装依赖库
按 Win + R,输入cmd打开命令提示符粘贴执行下面这一行 pip install pywin32
在桌面新建文本文档 把文末完整脚本代码全部复制进去 点击「文件 → 另存为」 文件名改为:word_batch_to_pdf.py 保存类型选:所有文件,确保后缀是 .py不是.txt
第 4 步:配置你的文件夹(最重要一步)用记事本打开 word_batch_to_pdf.py找到这一行: TARGET_FOLDER = r"C:\Users\Desktop\新建文件夹"✅ 修改后,以后直接双击脚本就能自动转换,不用再输命令!
第 5 步:运行脚本 & 查看结果
把所有要转的 .doc/.docx 放进你配置的文件夹 - 双击运行
word_batch_to_pdf.py 等待脚本执行完成 去原文件夹查看:每个 Word 旁边已生成同名 PDF
三、脚本核心优势(为什么推荐用它)
1.隐私绝对安全
全程本地处理,不联网、不上传,敏感合同、个人简历放心转。
2.格式零失真
用 Microsoft Word 原生导出,比第三方库更稳定,表格、页眉页脚、图片位置不变形。
3.批量效率拉满
一次放几十上百份文档,递归扫描子文件夹,后台自动跑完。
4.不破坏原文件
只生成新 PDF,原始 Word 不动,归档、备份两不误。
四、适用场景
合同 / 协议批量导出 PDF,防止篡改 简历批量转格式,统一投递 报告 / 标书归档,固定版式不跑版 课件 / 资料批量转 PDF,方便分享打印 企业内部文档标准化处理
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Word 批量转 PDF(本地离线版)功能:1. 在代码中指定一个文件夹路径;2. 递归扫描该文件夹下所有 .doc / .docx 文件;3. 在原文件所在目录生成同名 PDF;4. 若已存在同名 PDF,则直接覆盖;5. 全程本地转换,不上传文件,不修改原始 Word。依赖:- Windows- 已安装 Microsoft Word- pywin32: pip install pywin32使用方法:1. 修改下方 TARGET_FOLDER 为你的目标文件夹;2. 直接运行脚本即可。"""from __future__ import annotationsimport sysfrom pathlib import PathWORD_EXTENSIONS = {".doc", ".docx"}PDF_FORMAT = 17OPTIMIZE_FOR_PRINT = 0EXPORT_CURRENT_DOCUMENT = 0CREATE_NO_BOOKMARKS = 0# ====================== 请修改这里为你的文件夹路径 ======================TARGET_FOLDER = r"C:\Users\15388\Desktop\新建文件夹"# =======================================================================OVERWRITE_EXISTING_PDF = Truedef iter_word_files(folder: Path) -> list[Path]:files: list[Path] = []for path in folder.rglob("*"):if not path.is_file():continueif path.name.startswith("~$"):continueif path.suffix.lower() not in WORD_EXTENSIONS:continuefiles.append(path)files.sort()return filesdef convert_word_files(folder: Path) -> int:try:import pythoncomimport win32com.clientexcept ImportError:print("缺少依赖:请先执行 `pip install pywin32`")return 1word_files = iter_word_files(folder)if not word_files:print(f"未找到可转换的 Word 文件:{folder}")return 0print("开始转换,所有文件仅在本地处理,不会上传。")print(f"目标目录:{folder}")print(f"扫描到 Word 文件数量:{len(word_files)}")pythoncom.CoInitialize()word = Nonesuccess_count = 0fail_count = 0try:word = win32com.client.DispatchEx("Word.Application")word.Visible = Falseword.DisplayAlerts = 0for index, source_path in enumerate(word_files, start=1):pdf_path = source_path.with_suffix(".pdf")doc = Nonetry:doc = word.Documents.Open(str(source_path),ConfirmConversions=False,ReadOnly=True,AddToRecentFiles=False,Visible=False,)doc.ExportAsFixedFormat(OutputFileName=str(pdf_path),ExportFormat=PDF_FORMAT,OpenAfterExport=False,OptimizeFor=OPTIMIZE_FOR_PRINT,Range=EXPORT_CURRENT_DOCUMENT,Item=0,IncludeDocProps=True,KeepIRM=True,CreateBookmarks=CREATE_NO_BOOKMARKS,DocStructureTags=True,BitmapMissingFonts=True,UseISO19005_1=False,)success_count += 1print(f"[{index}/{len(word_files)}] 成功:{source_path} -> {pdf_path}")except Exception as exc:fail_count += 1print(f"[{index}/{len(word_files)}] 失败:{source_path},原因:{exc}")finally:if doc is not None:doc.Close(False)finally:if word is not None:word.Quit()pythoncom.CoUninitialize()print("\n转换完成")print(f"成功:{success_count}")print(f"失败:{fail_count}")return 0 if fail_count == 0 else 2def main() -> int:folder = Path(TARGET_FOLDER).expanduser().resolve()if not folder.exists():print(f"文件夹不存在:{folder}")return 1if not folder.is_dir():print(f"目标不是文件夹:{folder}")return 1print(f"当前配置的目标文件夹:{folder}")print(f"重复 PDF 处理方式:{'直接覆盖'if OVERWRITE_EXISTING_PDF else'保留原文件'}")return convert_word_files(folder)if __name__ == "__main__":sys.exit(main())
夜雨聆风