稀土掘金技术社区 前天 09:47
这种小工具居然也能在某鱼卖钱?我用Python一天能写100个,纯干货!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何使用Python脚本实现Word文档批量转换为PDF格式的功能。通过win32com.client库调用Word应用,实现单个或批量转换。文章提供了基础版本和批量转换版本代码,并解决了常见问题,如系统环境、宏和文件名限制等。此外,还增加了自动生成时间戳文件夹、自动获取Word文件、检测Office/WPS等功能,并将脚本打包成exe文件,方便用户使用。即使是不懂技术的用户也能轻松实现Word转PDF的需求。

💡使用`win32com.client`库,通过调用本地安装的Word或WPS软件,实现Word文档转换为PDF格式的功能,避免了使用第三方库可能带来的兼容性问题。

📁通过`os`模块,脚本可以自动扫描指定文件夹下的所有Word文档(`.doc`或`.docx`),并批量将它们转换为PDF格式,极大地提高了处理效率。

⚙️脚本可以自动检测当前系统安装的是Office还是WPS,并根据检测结果选择正确的调用方式,增强了脚本的兼容性和适应性。

⏱️脚本具备自动生成时间戳文件夹的功能,每次运行都会创建一个以当前时间命名的文件夹,用于存放转换后的PDF文件,方便用户管理和查找。

花小姐的春天 2025-05-30 08:30 重庆

(💰金石瓜分计划强势上线,速戳上图了解详情🔍)

前两天在某鱼闲逛,本来想找个二手机械键盘,结果刷着刷着突然看到有人在卖——「Word 批量转 PDF 小工具」,还挺火,价格也不高,但销量出奇地高,评论里一堆人在夸 “好用”、“终于不用一篇篇点了” 啥的。

说实话,当时我人都愣住了——

「这个功能我用 Python 十分钟能写完啊!」

然后我又搜了其它小工具,pdf 转 Word,Word 转图片,Word 加水印什么的…… 好多

好家伙,花姐以前教大家做的办公自动化小工具原来都能卖钱呀!

那咱今天先复刻一个 「Word 批量转 PDF 小工具」,顺便升级点功能,做个更丝滑的版本。

「保准你看完就能自己写个卖钱去。」

💡思路先摆明:Word 转 PDF,其实没那么复杂

你别看这功能听起来挺 “高端” 的,其实本质上干的事就是——

把一堆 Word 文档用程序打开,然后保存为 PDF 格式。

换句话说,这活本质就是个 “批处理”。用 Python 来干,简直再合适不过。

我们需要的工具是 

python-docx

?NoNoNo——这个库不支持保存为 PDF。真正的主角其实是:

    win32com.client

    :用来操作 Word 应用(需要 Windows 系统 + 装了 Office)

    或者跨平台一点的玩法,用 「LibreOffice + subprocess」,不过今天我们先来讲讲最稳最简单的方式:用 Word 本尊来干活。

🔧上代码:几行就能跑起来的 Word 转 PDF 脚本

好,开门见山,先上最基础的版本:

import osimport win32com.clientdef word_to_pdf(input_path, output_path):    word = win32com.client.Dispatch("Word.Application")    word.Visible = False  # 不弹窗,后台运行    doc = word.Documents.Open(input_path)    doc.SaveAs(output_path, FileFormat=17)  # 17 是 PDF 格式    doc.Close()    word.Quit()# 示例用法word_to_pdf("C:/Users/你的用户名/Desktop/测试文档.docx",             "C:/Users/你的用户名/Desktop/测试文档.pdf")

✍️几句解释:

    Dispatch("Word.Application")

     就是打开 Word 应用;

    FileFormat=17

     是告诉它 “嘿,我要存成 PDF”;
    结尾的 

    Quit()

     很重要,不然 Word 可能会在后台一直挂着,占资源。
    如果你电脑里安装的是 「WPS」

    Dispatch("Word.Application")

    这里改成

    Dispatch("kwps.Application")

    ,不然会报错

是不是很简单?连我猫都看懂了。

📂扩展:支持批量转换,一次性把一整个文件夹干掉!

很多人痛苦的点是 “文档太多,一个个转太麻烦”。

那好说,我们搞个批量版本,让它一口气全转了:

def batch_convert(folder_path):    word = win32com.client.Dispatch("Word.Application")    word.Visible = False    for file in os.listdir(folder_path):        if file.endswith(".doc") or file.endswith(".docx"):            doc_path = os.path.join(folder_path, file)            pdf_path = os.path.splitext(doc_path)[0] + ".pdf"            try:                doc = word.Documents.Open(doc_path)                doc.SaveAs(pdf_path, FileFormat=17)                doc.Close()                print(f"✅ 转换成功:{file}")            except Exception as e:                print(f"❌ 转换失败:{file},原因:{e}")    word.Quit()

使用方式:

batch_convert(r"C:\Users\你的用户名\Desktop\word文件夹")

🧐常见坑点,花姐来帮你避一避

写得简单不难,「难的是兼容和细节」

✅1. 系统必须是 Windows,而且得装了 MS Office

这玩意底层其实就是用 COM 调用了 Word 的功能,所以没有装 Word 是用不了的。

✅2. 文档里有宏的、被保护的,可能转不了

有些文档打开会弹窗提示宏或者密码,那个得手动改设置,程序跑不过去。

✅3. 文件名不要太长、路径不要有中文 / 空格

有时候路径太奇怪,Word 会打不开,转不了,建议统一放到纯英文文件夹里。

🎁额外加点料

    自动生成时间戳文件夹 + 输出日志

    自动获取脚本所在目录下的 Word 文件(不需要用户手动输路径)

    判断电脑里是否装了 Office(Word)或 WPS,并自动选对的调用方式

    打包售卖

⏱️ 一、生成时间戳文件夹

def gen_output_folder():    folder = os.path.dirname(os.path.abspath(__file__))    timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")    output_folder = os.path.join(folder, f"pdf_{timestamp}")    os.makedirs(output_folder, exist_ok=True)    return output_folder

📁 二、自动获取当前脚本目录下的 Word 文件

这太简单了:

import osdef get_word_files_from_current_folder():    folder = os.path.dirname(os.path.abspath(__file__))    word_files = []    for file in os.listdir(folder):        if file.endswith(".doc") or file.endswith(".docx"):            word_files.append(os.path.join(folder, file))    return word_files

🔍 三、检测 Office 和 WPS 的方法

我们可以尝试用 

win32com.client.gencache.EnsureDispatch()

 去判断这两个程序是否存在。

import win32com.clientdef detect_office_or_wps():    try:        word = win32com.client.gencache.EnsureDispatch("Word.Application")        return "office"    except:        try:            wps = win32com.client.gencache.EnsureDispatch("Kwps.Application")            return "wps"        except:            return None

🔄 四、自动选择引擎并批量转换

import osimport win32com.clientdef convert_word_to_pdf_auto(input_path, output_path, engine):    if engine == "office":        app = win32com.client.Dispatch("Word.Application")    elif engine == "wps":        app = win32com.client.Dispatch("Kwps.Application")    else:        print("❌ 没有检测到可用的 Office 或 WPS")        return    app.Visible = False    try:        doc = app.Documents.Open(input_path)        doc.SaveAs(output_path, FileFormat=17)        doc.Close()        print(f"✅ 转换成功:{input_path}")    except Exception as e:        print(f"❌ 转换失败:{input_path},原因:{e}")    try:        app.Quit()    except:        print("⚠️ 当前环境不支持 Quit,跳过退出。")

🚀 五、整合所有内容,一键搞定脚本所在目录下的所有 Word 文件

def batch_convert_here():    engine = detect_office_or_wps()    if not engine:        print("😭 系统里没有安装 Office 或 WPS,没法转换")        return    folder = os.path.dirname(os.path.abspath(__file__))    word_files = get_word_files_from_current_folder()    if not word_files:        print("🤷‍♀️ 当前文件夹没有发现 Word 文件")        return    output_folder = os.path.join(folder, "pdf输出")    os.makedirs(output_folder, exist_ok=True)    for word_file in word_files:        filename = os.path.splitext(os.path.basename(word_file))[0]        pdf_path = os.path.join(output_folder, f"{filename}.pdf")        convert_word_to_pdf_auto(word_file, pdf_path, engine)    print("🎉 所有文件转换完成啦!PDF 都在 'pdf输出' 文件夹里")

「🧪 运行方式(放在脚本结尾):」

if __name__ == "__main__":    batch_convert_here()

📦六、 做成 EXE 给小白用户用(pyinstaller)

最后一步,把咱的脚本打包成 

.exe

,丢到某鱼卖钱(手动狗头🐶)

命令就一句话:

pyinstaller -F word2pdf.py

生成的 

dist/word2pdf.exe

 就是可执行文件,随便拿给谁用都行(当然系统要有 Word)。

完整代码

import osimport win32com.clientimport sysimport datetimedef get_real_path():    """兼容开发与打包环境的路径获取"""    if getattr(sys, 'frozen', False):        base_dir = os.path.dirname(sys.executable)  # EXE文件所在目录[1,7](@ref)    else:        base_dir = os.path.dirname(os.path.abspath(__file__))    return base_dir# 生成时间戳文件夹def gen_output_folder(folder):    # folder = os.path.dirname(os.path.abspath(__file__))    timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")    output_folder = os.path.join(folder, f"pdf_{timestamp}")    os.makedirs(output_folder, exist_ok=True)    return output_folder# 自动获取当前脚本目录下的 Word 文件def get_word_files_from_current_folder(folder):    # folder = os.path.dirname(os.path.abspath(__file__))    word_files = []    for file in os.listdir(folder):        if file.endswith(".doc") or file.endswith(".docx"):            word_files.append(os.path.join(folder, file))    return word_files# 检测 Office 和 WPS 的方法def detect_office_or_wps():    try:        word = win32com.client.gencache.EnsureDispatch("Word.Application")        return "office"    except:        try:            wps = win32com.client.gencache.EnsureDispatch("Kwps.Application")            return "wps"        except:            return None# 自动选择引擎并批量转换def convert_word_to_pdf_auto(input_path, output_path, engine):    if engine == "office":        app = win32com.client.Dispatch("Word.Application")    elif engine == "wps":        app = win32com.client.Dispatch("Kwps.Application")    else:        print("没有检测到可用的 Office 或 WPS")        return    app.Visible = False    try:        doc = app.Documents.Open(input_path)        doc.SaveAs(output_path, FileFormat=17)        doc.Close()        print(f"转换成功:{input_path}")    except Exception as e:        print(f"转换失败:{input_path},原因:{e}")    try:        app.Quit()    except:        print("当前环境不支持 Quit,跳过退出。")# 主函数  def batch_convert_here():    engine = detect_office_or_wps()    if not engine:        print("系统里没有安装 Office 或 WPS,没法转换")        return    folder = get_real_path()    word_files = get_word_files_from_current_folder(folder)    if not word_files:        print("当前文件夹没有发现 Word 文件")        return    output_folder = gen_output_folder(folder)    for word_file in word_files:        filename = os.path.splitext(os.path.basename(word_file))[0]        pdf_path = os.path.join(output_folder, f"{filename}.pdf")        convert_word_to_pdf_auto(word_file, pdf_path, engine)    print("所有文件转换完成啦!PDF 都在 'output_folder' 文件夹里")if __name__ == "__main__":    try:        batch_convert_here()        print("按 Enter 键退出...")        input()  # 等待用户按 Enter 键    except Exception as e:        print(e)        print("程序运行错误,按 Enter 键退出...")        input()  # 等待用户按 Enter 键

你可能觉得:“这不就是几十行代码嘛,卖这个会有人买吗?”

我一开始也这么想。后来我想通了,某鱼上很多买家,根本不懂技术,他们在意的是:✅ 能不能一键搞定?✅ 会不会太复杂?✅ 省不省事?

所以啊,「写工具 + 提供说明 + 包装打包」,这些就构成了 “产品”。

我们程序员有时候太低估自己的能力了——其实你随手写的脚本,真的能解决很多人的问题。


AI编程资讯AI Coding专区指南:https://aicoding.juejin.cn/aicoding

""~

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python Word转PDF 办公自动化 win32com
相关文章