这种小工具居然也能在某鱼卖钱?我用Python一天能写...
ztj100 2025-07-28 01:28 4 浏览 0 评论
前两天在某鱼闲逛,本来想找个二手机械键盘,结果刷着刷着突然看到有人在卖—— 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 os
import win32com.client
def 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) 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你的用户名Desktopword文件夹")
常见坑点,花姐来帮你避一避
写得简单不难,难的是兼容和细节 。
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 os
def 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
C 三、检测 Office 和 WPS 的方法
我们可以尝试用
win32com.client.gencache.EnsureDispatch() 去判断这两个程序是否存在。
import win32com.client
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
三、自动选择引擎并批量转换
import os
import win32com.client
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,跳过退出。")
四、整合所有内容,一键搞定脚本所在目录下的所有 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 os
import win32com.client
import sys
import datetime
def get_real_path(): """兼容开发与打包环境的路径获取""" if getattr(sys, 'frozen', False): base_dir = os.path.dirname(sys.executable) else: base_dir = os.path.dirname(os.path.abspath(__file__)) return base_dir
def gen_output_folder(folder): 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
def get_word_files_from_current_folder(folder): 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
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() except Exception as e: print(e) print("程序运行错误,按 Enter 键退出...") input()
--- 你可能觉得:“这不就是几十行代码嘛,卖这个会有人买吗?”
我一开始也这么想。后来我想通了,某鱼上很多买家,根本不懂技术,他们在意的是: 能不能一键搞定? 会不会太复杂? 省不省事?
所以啊,写工具 + 提供说明 + 包装打包 ,这些就构成了“产品”。
我们程序员有时候太低估自己的能力了——其实你随手写的脚本,真的能解决很多人的问题。
相关推荐
- Python 操作excel的坑__真实的行和列
-
大佬给的建议__如何快速处理excelopenpyxl库操作excel的时候,单个表的数据量大一些处理速度还能接受,如果涉及多个表甚至多个excel文件的时候速度会很慢,还是建议用pandas来处理,...
- Python os.path模块使用指南:轻松处理文件路径
-
前言在Python编程中,文件和目录的操作是非常重要的一部分。为了方便用户进行文件和目录的操作,Python标准库提供了os模块。其中,os.path子模块提供了一些处理文件路径的函数和方法。本文主要...
- Python常用内置模块介绍——文件与系统操作详解
-
Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互...
- Python Flask 建站框架实操教程(flask框架网页)
-
下面我将带您从零开始构建一个完整的Flask网站,包含用户认证、数据库操作和前端模板等核心功能。##第一部分:基础项目搭建###1.创建项目环境```bash...
- 为你的python程序上锁:软件序列号生成器
-
序列号很多同学可能开发了非常多的程序了,并且进行了...
- PO设计模式全攻略,在 UI 自动化中的实践总结(以企业微信为例)
-
一、什么是PO设计模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,即一个py文件,并以页面为单位来写测试用例,实现页面对象和测试用例的...
- 这种小工具居然也能在某鱼卖钱?我用Python一天能写...
-
前两天在某鱼闲逛,本来想找个二手机械键盘,结果刷着刷着突然看到有人在卖——Word批量转PDF小工具...
- python打包成exe,程序有图标,但是任务栏和窗口都没有显示图标
-
代码中指定图标信息#设置应用ID,确保任务栏图标正确显示ifsys.platform=="win32":importctypesapp_id=...
- 使用Python构建电影推荐系统(用python做推荐系统)
-
在日常数据挖掘工作中,除了会涉及到使用Python处理分类或预测任务,有时候还会涉及推荐系统相关任务。...
- python爬取并分析淘宝商品信息(python爬取淘宝商品数据)
-
python爬取并分析淘宝商品信息背景介绍一、模拟登陆二、爬取商品信息1.定义相关参数2.分析并定义正则3.数据爬取三、简单数据分析1.导入库2.中文显示3.读取数据4.分析价格分布5.分析销售...
- OpenCV入门学习基础教程(从小白变大神)
-
Opencv是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,需要的朋友可以...
- python图像处理-一行代码实现灰度图抠图
-
抠图是ps的最基本技能,利用python可以实现用一行代码实现灰度图抠图。基础算法是...
- 从头开始学python:如何用Matplotlib绘图表
-
Matplotlib是一个用于绘制图表的库。如果你有用过python处理数据,那Matplotlib可以更直观的帮你把数据展示出来。直接上代码看例子:importmatplotlib.pyplot...
- Python爬取爱奇艺腾讯视频 250,000 条数据分析为什么李诞不值得了
-
在《Python爬取爱奇艺52432条数据分析谁才是《奇葩说》的焦点人物?》这篇文章中,我们从爱奇艺爬取了5万多条评论数据,并对一些关键数据进行了分析,由此总结出了一些明面上看不到的数据,并...
- Python Matplotlib 库使用基本指南
-
简介Matplotlib是一个广泛使用的Python数据可视化库,它可以创建各种类型的图表、图形和可视化效果。无论是简单的折线图还是复杂的热力图,Matplotlib提供了丰富的功能来满足我们...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Python 操作excel的坑__真实的行和列
- Python os.path模块使用指南:轻松处理文件路径
- Python常用内置模块介绍——文件与系统操作详解
- Python Flask 建站框架实操教程(flask框架网页)
- 为你的python程序上锁:软件序列号生成器
- PO设计模式全攻略,在 UI 自动化中的实践总结(以企业微信为例)
- 这种小工具居然也能在某鱼卖钱?我用Python一天能写...
- python打包成exe,程序有图标,但是任务栏和窗口都没有显示图标
- 使用Python构建电影推荐系统(用python做推荐系统)
- python爬取并分析淘宝商品信息(python爬取淘宝商品数据)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)