PyQt5 从零开始制作 PDF 阅读器(一)
效果图
UI 设计
首先使用 Qt Designer 设计出图形界面:
新建一个 MainWindow 主界面,然后设置一个 toolbar,并在 toolbar 中添加三个 action,并为每个 action 设置好相应图标。
也可以直接 compile 我制作好的 PyReader.ui 文件,或者导入 Ui_PyReader.py 文件。
依赖要求
Python3
PyQt5
PyMuPDF
主要任务
我们使用 PyMuPDF 来解析 PDF ,来获取 PDF 文本信息。
安装
我们只须在 cmd 中输入:pip install PyMuPDF,即可安装 PyMuPDF。
导入
# 导入 PyMuPDF importfitz
在本节中,我们只需了解以下几个基本操作:
fitz.open() 函数用来读取 PDF 文件内容,doc.loadPage() 函数用来获取具体某一页的信息。特别的 ,我们使用loadPage(0) 来获取封面信息。
# 读取 PDFdoc=fitz.open(fname)# 获取第 n 页内容page=doc.loadPage(n)
本节主要的内容就是把封面渲染到主界面中,并完成添加与删除封面的任务。
显示表格
我们采用 QtWidgets.QTableWidget 表格控件来显示封面。
首先让我们设置表格样式与功能:
其中,我们设置了单元格的纵横比为 4 : 3,以及其他的一些静态属性,并将 self.table 与右键菜单绑定,支持点击单元格调用 self.generateMenu 函数。
添加封面
首先让我们来看如何生成 TableWidget 可显示的 图像类文件。
我们通过 doc.loadPage(0) 获取页面对象,并传递给 render_pdf_page() 函数,设置缩放比为 1 : 1。首先构建 QImage 对象,在通过 convertFromImage 函数将 QImage 对象转化为可显示对象。
接着,我们就要想单元格中添加封面图片:
我们使用工具栏中的 + 号来添加 PDF 封面。
self.addbar.triggered.connect(self.open),当点击 + 号时,就会调用 self.open 函数。
我们通过 getOpenFileName() 函数 来获取文件地址,self 后面的三个参数分别是窗口名称,文件默认路径以及支持的文件类型,这个函数返回文件的地址。
filter_book() 函数用来确保不会重复显示同一本书的封面。
然后,我们就要将 PDF 封面渲染到主界面上:
label.setScaledContents(True) 使得图片可以充满 label。self.table.setCellWidget(self.x, self.y, label) 用来设置标签的行与列。最后确保每八个元素换行,换行后将列数清零。
右键菜单
上面我们已经提到,如何将单元格与右键菜单绑定。
本次教程中,右键菜单只有两项,分别为开始阅读(暂未实现),以及删除图书。
接下来,让我们看如何删除图书:
首先维护一个 self.booklist ,里面储存无重复 PDF 文件地址。首先获取图书在 booklist 中的索引,在 booklist 中删除该元素。接着清空选中单元格之后(包含选中单元格)的所有单元格的内容。最后将 booklist 中 index 之后的图书地址重新显示到 table 上。简单地说,就是删除选中单元格,并将之后单元格向前挪一位。