基于pyqt5, pymupdf实现的批量添加目录书签,增强pdf,拆分合并pdf的小工具
PDF 是一种便携,易查找的电子书,在学习工作中我们可能需要翻阅大量的参考书籍,实体书往往贵且笨重,如果需要经常翻阅,那么可以购置纸质书。但是大多数时候我们可能只是需要查阅书中的某一部分,如此电子书便具有不可比拟的优势,互联网上有者大量的电子书籍,且多数以pdf
格式流传,其中一部分为文字版,一部分为扫描版。这些文件一般为自制的盗版书籍,往往缺少书签,或者扫描不清晰。以致索引困难,观感极差。
市面上也有很多pdf编辑器
,如Adobe Acrobat PDF
,PDF Element
,福昕PDF编辑器
等,但他们大多价格昂贵,且没有批量添加书签的功能,虽有OCR增强的功能,但是比较耗时,且在年迈的PC上容易卡死。此工具没有使用OCR,仅对扫描页面的图片逐一增强来改善PDF清晰度。
pyqt5
,pymupdf
,python3.7
,qt designer
,QCandyUi
(可选)-i https://pypi.tuna.tsinghua.edu.cn/simple
,如pip3 install pymupdf -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install pyqt5,pyqt5-tools
designer
可启动 QT DesignerAnanconda
,则pyqt
版本过高可能会导致Spyder
无法打开,此时请使用如下命令,更换版本,(不要频繁的使用conda update)pip3 uninstall pyqt5
pip3 install pyqt5==5.12.0
版本号如果有误,终端会列出可安装的版本,选择其一输入即可
我没有配置,逐一进行
用途 | 工具/方法 |
---|---|
绘制用户界面 (UI) | QT Designer |
UI转Python代码 | pyuic5 |
编写Python 代码 | PyCharm / VS Code |
执行代码 | python3.7 (PyCharm / VS Code) |
打包为可执行文件 (可选) | pyinstaller |
使用QT Designer 绘制界面(如上图) ,选择 QDialog without Button
,拖拽控件,绘制后保存为.ui
文件,我分别保存为PDFTools.ui
add_UI.ui
enhance_UI.ui
merge_UI.ui
split_UI.ui
,绘制界面比较简单,但是控件命名
应当添加适当的前缀或后缀
加以区分。
使用pyuic5
命令将ui文件转换为python代码,切换到项目文件夹,输入
pyuic5 PDFTools.ui -o PDFTools.py
依次对界面代码进行转换,生成后的py文件无需手动更改,当再次生成时会完全覆盖。
编写调用窗口和信号处理代码。pyqt延续了qt的设计思想,只要处理好信号与槽(可理解为触发事件与处理方法关联),那么编写项目也会得心应手。在编写过程中可查看qt类手册,pyqt中的方法大多与QT C++同名,但是少了丑陋的指针
->
,使代码不那么扎眼。具体见代码解析
推荐使用ipython
在命令行窗口对方法/类 进行测试
如果需要可进行打包
pyinstaller --onefile --windowed --icon=PDF.ico main.py
callxxx.py
均可独立运行)代码组成
--------窗口信号处理----------
main.py
callAdd.py
callEnhance.py
callSplit.py
callMerge.py
--------窗口界面布局----------
PDFTools.py
add_UI.py
enhance_UI.py
split_UI.py
merge_UI.py
--------PDF处理函数----------
addFunctins.py
enhanceFunctions.py
splitFunctions.py
用到的QT控件信号, 通过 connect 可关联方法
控件 | 信号 |
---|---|
pushButton | clicked |
spinBox | valueChanged /editingFinished |
Slider | sliderMoved / valueChanged |
radioButton | toggled |
lineEdit | textChanged |
checkBox | stateChanged |
comboBox | currentIndexChanged |
用到的QT控件方法 ,大多数控件都有setText() 和text() 方法,不一一列举
控件 | 方法 |
---|---|
textEdit | setText() /text() |
lineEdit | setText() / text() |
checkBox | isChecked() |
tableWidget | setItem() |
spinBox | setReadOnly() |
lineEdit | setReadOnly |
pymupdf
中的方法
名称 | 描述 |
---|---|
open | 打开文件(pdf,图片) |
save | 保存 |
setToC | 设置目录 |
getPixmap | 获取本页的图片 |
insertPDF | 插入PDF |
close | 关闭 |
pageCount | 获取页码(属性) |
getToC | 获取目录 |
os
,PIL
中的方法
方法 | 描述 |
---|---|
open | 打开txt |
write | 写入txt |
close | 关闭文本 |
strip | 删除指定符号 |
split | 根据指定符号分割字符串 |
len | 计算长度,数量 |
range | 连续的数 |
replace | 替换指定字符串 |
os.getcwd() | 获取当前文件路径 |
os.path.exists() | 是否存在文件夹 |
os.makedirs() | 创建文件夹 |
os.remove() | 删除文件 |
Image.open | 打开图片 |
ImageEnhance.Contrast | 增强方法 |
demo.txt
该文件是存放目录(书签)的文件,要求和格式见下,在打开添加目录
窗口的同时会自动生成该文件
# =========================================================================
#
# 建议在如下网站搜集目录:
# 1.京东图书 https://book.jd.com/
# 2.豆瓣读书 https://book.douban.com/
# 3.当当图书 http://book.dangdang.com/
# 4.文泉书局 https://wqbook.wqxuetang.com/
#
# =========================================================================
# 标准格式1 如下:(空行不影响)
# 特征 :两部分构成: 标题 + 空格 + 页码
# 标题中含 '第' 和 '章' 的会识别为一级标题,其他为二级标题
# =========================================================================
第1章概述 1
什么是OpenCV 1
OpenCV怎么用 2
什么是计算机视觉 3
OpenCV的起源 6
OpenCV的结构 7
使用IPP来加速OpenCV 8
谁拥有OpenCV 9
下载和安装OpenCV 9
# ==========================================================================
# 标准格式2 如下
# 特征 :章序/节序 + 空格 + 标题 + 空格 + 页码 (空格用于区分各元素)
# 无 章节序 的 默认识别为 二级标题 ,若想设置为一级标题,请在前加 '@ ',
# 一般 需要区分的是 前言 目录 附录 参考文献 这些
# 节序中有一个点 表二级标题(如 6.1 ),两个点 表三级标题(如 1.2.3),以此类推
# ==========================================================================
第6章 支持向量机 121
6.1 间隔与支持向量 121
6.2 对偶问题 123
6.3 核函数 126
6.4 软间隔与正则化 129
6.5 支持向量回归 133
6.6 核方法 137
6.7 阅读材料 139
习题 141
休息一会儿 145
@ 参考文献 520
# ==========================================================================
第一次使用pyqt5
写一个完整的项目,用时大概六天。前期绘制界面一天。后期逐一完善各个功能四天,写文档,改bug一天。最大的感受就是Python语法友好,轮子很全。本次项目也是熟悉pyqt的过程。写完本应用基本掌握了常用的控件,信号,槽。整体而言,使用pyqt5编写一些小工具还是很方便的。至于执行效率,一般的小项目基本体现不出来。
PyQt5优点:相较于QT Creator,python代码比较优雅;相较于 C# Winform/WPF ,python拥有较多的库。可用样式表setStyleSheet
美化控件
缺点:QT Designer 可设置参数偏少,需要使用代码设置,控件不够美观,打包文件偏大,推荐直接运行脚本。
- [ ] 自定义样式表
- [ ] 自动爬取目录
- [ ] img2pdf