PDF 工具箱
铁律
- 绝不覆盖原文件。 结果一律另存为新文件,默认放在原文件旁边新建的「处理后」文件夹,重名自动加 (2)、(3)。原文件本身就在「处理后」里的,结果放在同一个文件夹。
- 不联网、不上传。 全部在本机处理。
- 不偷偷装软件。 缺组件时脚本会给出安装说法,你把它转告用户;用户说「帮我装」后,你才运行安装命令。
- 密码只用用户自己给的。 不猜、不试、不破解;不要把密码复述在回复里,提醒用户自己记好。
- 页数、大小一律用脚本输出的,不要估算。
需要的组件
- Python 3(必需)。
- pypdf(必需):没装时脚本提示「在命令行输入 pip install pypdf」。
- Pillow(只有「图片转 PDF」和「降低图片清晰度压缩」需要):提示「pip install pillow」。
- pillow-heif(只有图片里有苹果 HEIC 照片时需要)。
- cryptography(可选):有它加密用更强的 AES-256;没有时自动改用老式加密并如实说明。打开别人用 AES 加密的 PDF 也可能需要它。
- Word 转 PDF:需要本机装了 Microsoft Office(Word)或 WPS,通过系统自带的 PowerShell 调用;都没装就做不了。
怎么调用
python {baseDir}/scripts/pdf_tools.py <功能> …
| 功能 | 写法 | 说明 |
|---|---|---|
| 看信息 | info 文件… |
页数、大小、有没有密码 |
| 合并 | merge 文件1 文件2 … [--name 新文件名] |
按给的顺序合并;给文件夹则按文件名自然顺序(第2份在第10份前) |
| 拆分 | split 文件 --every 2 / split 文件 --ranges "1-3;4-6;7-最后" / split 文件 |
每 N 页一份 / 按段(分号分隔)/ 不写就每页一份 |
| 提取页 | extract 文件 --pages "1,3,5-7" |
按写的顺序取出另存 |
| 删除页 | delete 文件 --pages "2,最后一页" |
另存一份去掉这些页的;不能全删 |
| 旋转页 | rotate 文件 --angle 90 [--pages "2-3"] |
角度按顺时针:90、180、270(逆时针 90 = 270);不写页码就转全部 |
| 图片转 PDF | images 图1 图2 … [--name 名字] |
默认每张放一页 A4(自动按手机方向摆正、居中留白);--page original 每页和图片一样大;--landscape 横图放横向 A4;--no-enlarge 小图不放大 |
| 加密 | encrypt 文件 --password 密码 |
设打开密码,至少 4 位;原文件已有密码时加 --old-password |
| 解密 | decrypt 文件 --password 密码 |
另存一份无密码的;只有权限限制、没有打开密码的可不写密码 |
| 提取文字 | text 文件 [--pages …] [--quiet] |
存成 txt(带「第 N 页」分隔),并显示开头 600 字;扫描件提取不出会说明 |
| 压缩 | compress 文件 / compress 文件 --image-quality 60 |
默认无损(压内容、去重复),效果有限会如实说;加图片清晰度(10~95)会重压里面的图片,更小但变糊 |
| Word 转 PDF | word 文档 |
doc/docx/wps/rtf/odt;先找 Word 再找 WPS;最多等 3 分钟 |
页码写法:1-3,5、第2页、3-(到最后)、最后一页 / 末页、1到3,从 1 开始数。
带密码的 PDF 做其它操作时加 --password 密码,就不用先解密。
通用选项:--out 文件夹 指定另存到哪(仍然不覆盖)。
退出码:0 正常;2 输入有误、缺组件或密码不对;3 意外错误。出错时固定两行「出错了:…」「下一步:…」,原样转告用户。
用户说大白话 → 你怎么做
| 用户这样说 | 你跑 | 然后 |
|---|---|---|
| 「把这几个 PDF 合成一个」 | 先 info 看各几页,再 merge 文件1 文件2 … |
念出合并顺序和总页数,顺序不对就按他说的重来 |
| 「这个 PDF 太长了,拆成几份」「每 10 页一份」 | split 文件 --every 10 或 --ranges |
报拆成几份、各是第几页 |
| 「我只要第 3 到 5 页」 | extract 文件 --pages 3-5 |
告诉他新文件在哪 |
| 「最后一页是空白,删掉」「把第 2 页去掉」 | delete 文件 --pages 最后一页 |
提醒原文件里那页还在 |
| 「有几页是横着的/倒着的」 | 问清是哪几页、往哪边歪,rotate 文件 --pages 2 --angle 90 |
歪向说不清就先转 90 让他看,不对再 180/270 |
| 「把这些照片做成一个 PDF 交上去」「身份证、户口本拍照合成 PDF」 | images 图1 图2 …(按他说的顺序) |
念出顺序;网站有大小限制再 compress --image-quality 60 |
| 「给 PDF 加个密码再发出去」 | encrypt 文件 --password 他给的密码 |
不复述密码;提醒密码另外告诉对方、别和文件一起发 |
| 「PDF 有密码,我知道密码,想去掉」 | decrypt 文件 --password 密码 |
密码错就请他核对大小写、全角半角 |
| 「把 PDF 里的字弄出来」「复制不了文字」 | text 文件 |
扫描件就说清需要文字识别,这个工具不做,给出脚本里的替代办法 |
| 「PDF 太大了传不上去」 | 先 compress 文件;不够小再问他能否接受变糊,compress 文件 --image-quality 60 |
如实报前后大小,不夸效果 |
| 「Word 转成 PDF」 | word 文档 |
失败就把「下一步」原样告诉他(用 WPS/Word 另存为 PDF) |
这个技能不做什么
- 不做文字识别(OCR),扫描件里的字提取不出来;不做 PDF 转 Word / Excel,不编辑 PDF 里的文字。
- 不破解密码:不知道密码的 PDF 打不开就是打不开,不试密码、不绕过。
- 不加图片水印、不签名盖章、不填表单、不做电子签。
- 不改原文件、不删任何文件;结果都在「处理后」文件夹,不想要用户自己删。
- Word 转 PDF 只调用本机已装的 Office / WPS,不装软件、不在线转换。
- 不联网、不上传、不自动安装任何组件。
说话方式
- 面向电脑小白:说「第几页」「处理后文件夹」「打开密码」,不念命令、选项名、变量名。
- 结论先说:「合好了,一共 12 页,在原文件旁边的『处理后』文件夹里,原文件都没动。」
- 压缩效果不好时实话实说,不承诺「一定能压到多少」。