二、核心功能一览
· 批量转换:一次添加多个 PDF 文件,按队列依次转换;
直接将 PDF 拖进窗口便可实现拖拽添加, 若存在依赖且选择的依赖未安装, 那么便会自动下降等级成为依靠按钮来添加标点句号。
可灵活变动的页面范围, 它支持将整本书籍进行转换, 同时也能够支持用户自行定义范围, 像是可以设置为 1-5 这种格式 , 也能选择 1,3,5 样式的 , 还能选用 1-3,7,9-10 这样的 ,甚至当出现倒序范围比如 3-1 时 , 它还会自动进行纠正, 并且兼容中文逗号以及破折号。
· 存在多种输出格式, 其中包括PNG, 此格式为无损的, 是被推荐的, 还有JPG, 该格式质量是可调的, 另外还有BMP以及TIFF, 全都包含在内。
· 可以进行自定义的 DPI, 其范围是 36 到 600 之间能够调节, 其中 150 这个数值适合用于屏幕阅读, 300 这个数值适合用于打印。
· JPG 质量调节:10% ~ 100% 滑块实时调整;
· 后台线程转换:界面不卡顿,转换过程中可随时取消;
· 实时进度条:跨文件统计总进度,逐页显示当前输出文件;
完善的错误处理, 文件出现坏掉的情况, PDF存在加密现象, 路径呈现无效状态, 页码超出界限等, 均会有友好的提示。
· 针对防覆盖机制而言, 当输出目录当中存在具有相同名称的文件之时, 会自动进行序号的追加操作, 并且绝对不会实施覆盖行为。
- 零界面依赖有着这样的核心逻辑, - 转换函数和 GUI 是完全解耦的, - 它能够独立进行调用, - 也能够独立开展测试。
三、快速开始
1. 克隆仓库
git clone
cd pdf-to-image
2. 安装依赖
pip -r .txt
依赖非常少,只有两个:
>= 1.24(必需):PDF 渲染引擎
大于等于0.4且为可选配置时, 启用可拖拽文件的功能, 若未安装该功能则会自动进行降级处理。
说明: 随 自带,一般无需单独安装。
3. 运行
.py
倘若项目内存在venv虚拟环境, 用户能够直接双击「启动转换工具.bat」, 而倘若缺少该虚拟环境这一状况, 将会退回到系统。
环境要求: 3.8+
四、使用说明
1. 点击「添加文件」,或直接把 PDF 拖进文件列表;
2. 按需设置:
· 页面范围: 将其留空从而使转换为整本, 它支持像 1 - 5 这种写法, 还支持 1,3,5 这种写法, 以及 1 - 3,7,9 - 10 这种等写法。
·输出格式为, PNG, 或JPG, 或BMP, 或TIFF。
· DPI 分辨率:越高越清晰,同时文件也越大;
· JPG 质量:仅 JPG 格式生效;
· 输出目录:默认保存到桌面「PDF转图片输出」文件夹;
3. 点按「开始转换」, 借由进度条去察看进度, 任何时候都能够点击「取消」。
4. 完成后点击「打开输出目录」查看结果。
输出文件命名规则:
_第N页.,例如「测试文档_第1页.png」。
五、把它当「库」用:核心逻辑一键复用
这个项目里头, 存在着最具价值的一个要点, 那便是核心转换逻辑跟 GUI 达成了全然的解耦状态。你根本无需图形界面, 就能够于自身的代码当中直接进行调用:
from
# 整本转换为 300 DPI 的 PNG
n, = (
="文档.pdf",
="./",
为空, #保持空白=整个本子;或者“1到5”, “1, 3, 5”。
dpi=300,
=90, # 仅 JPG 生效
print(f"成功转换 {n} 页")
for path in :
print(path)
还支持进度回调与取消:
from
= .Event()
def (done, total, ):
print(f"{done}/{total}: {}")
文档.pdf, 输出路径为./out, 范围是1 - 10, 格式为JPG, 分辨率为150, 宽高比为85。
=, =)
这表明, 你能够于Web后端之内, 在自动化脚本当中, 于批处理任务期间, 径直复用这套逻辑, 然而不必在意任何界面方面的细节。
六、几个值得一看的设计细节
如果你对源码感兴趣,下面这几个点很有参考价值:
1. 页面范围解析:健壮且友好
对多种写法予以支持, 针对此做了容错方面的处理, 其中包括兼容中文逗号「, 」以及中文破折号「—」, 在倒序范围的情况下, 3 - 1会自动被纠正为1 - 3, 当页码出现越界状况时, 会抛出带有具体页码的友好错误。
2. 渲染核心:DPI 与像素的换算
zoom = dpi / 72.0
mat = fitz.(zoom, zoom)
像素等于页面, 该页面等于矩阵, 且透明度为假。
72DPI是PDF的标准分辨率, 借助fitz.(zoom, zoom), 能够获取任意DPI的高清渲染。
3. 后台线程 + 队列,界面永不卡顿
先在后台线程里展开执行其转换, 接着借助queue.Queue将进度消息推送给主线程, 之后采用root.after()来回进行轮询以更新界面, 并且通过.Event达成随时能够取消之举, 从中获得的体验相当流畅的效果。
4. 防覆盖机制
输出目录已有同名文件时,自动追加序号,绝不覆盖。
5. 兼容性处理
既能兼容新版之包名, 又能兼容旧版之包名, 此包名与fitz相关, 并且还要兼容旧版那种没有参数的情形。
七、项目结构
整个项目非常精简,一目了然:
.py 主程序(核心转换逻辑 + GUI)
.py 无界面自动化测试
.txt 依赖清单
启动转换工具.bat 一键启动脚本
八、运行测试
项目带有无界面的测试脚本, 其涵盖转换现象, 包含页面范围的解析结果, 以及各类因特殊情况而产生的异常场景。
.py
测试内容包括:
· 整本转换(PNG / 150 DPI / 10 页);
· 页面范围进行转换, 转换范围为1至5, 又从1至3, 还有7以及9至10, 并且是倒序3至1, 同时具备自动纠正功能。
· JPG 格式 + 质量参数 + 300 DPI;
异常处理包含, 页码超出界限, 格式出现错误, 文件遭到损坏, PDF 被加密, 以及文件不存在。
· 图片尺寸随 DPI 变化的正确性验证。
九、常见问题
Q: 提示「未安装 」?
运行 pip ,或使用随附的「启动转换工具.bat」。
Q: 拖拽功能不可用?
当 pip 这个可选依赖未被安装时, 可借助「添加文件」按钮正常实现它的使用并进行该项安装。
Q: 提示「该 PDF 已加密」?
本工具暂不支持加密 PDF,请先用其他工具解密后再转换。
Q: 转换的图片太大/太小?
使 DPI 设置得以调整: 针对屏幕查看, 采用 96至150的数值来设定, 用于打印时, 将其设置为 300, 而在进行高清扫描时, 则需使用 400及以上的数值来设置。
十、总结
这个项目有着目标, 目标是很简单的, 那就是将一件事, 这件事是把PDF转图片, 做到一种程度, 这种程度是「打开就能用」。
它对于普通用户而言, 是一个桌面小工具, 这个小工具干净, 这个小工具免费, 这个小工具无广告。
对于开发者而言, 它属于一个项目, 这个项目结构清晰, 并且逻辑解耦, 还能够直接复用。
对于学习者而言, 它是一个能用来了解桌面开发的很好例子, 也是能用来了解多线程的很好例子, 还是能用来了解队列的很好例子, 更是能用来了解渲染的很好示例。
项目运用 MIT 开源方式, 欢迎感受体会、给予 Star、加以 Fork, 并提出 Issue。要是你觉着具有用处之意, 同样欢迎分享给到身旁存在着需要需求的友人。