PyQt5 从零开始制作 PDF 阅读器(一)

效果图

PyQt5 从零开始制作 PDF 阅读器(一)

UI 设计

首先使用 Qt Designer 设计出图形界面:

新建一个 MainWindow 主界面,然后设置一个 toolbar,并在 toolbar 中添加三个 action,并为每个 action 设置好相应图标。

也可以直接 compile 我制作好的 PyReader.ui 文件,或者导入 Ui_PyReader.py 文件。

PyQt5 从零开始制作 PDF 阅读器(一)

依赖要求

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 函数。

PyQt5 从零开始制作 PDF 阅读器(一)

添加封面

首先让我们来看如何生成 TableWidget 可显示的 图像类文件。

我们通过 doc.loadPage(0) 获取页面对象,并传递给 render_pdf_page() 函数,设置缩放比为 1 : 1。首先构建 QImage 对象,在通过 convertFromImage 函数将 QImage 对象转化为可显示对象。

PyQt5 从零开始制作 PDF 阅读器(一)

接着,我们就要想单元格中添加封面图片:

我们使用工具栏中的 + 号来添加 PDF 封面。

self.addbar.triggered.connect(self.open),当点击 + 号时,就会调用 self.open 函数。

我们通过 getOpenFileName() 函数 来获取文件地址,self 后面的三个参数分别是窗口名称,文件默认路径以及支持的文件类型,这个函数返回文件的地址。

filter_book() 函数用来确保不会重复显示同一本书的封面。

PyQt5 从零开始制作 PDF 阅读器(一)

然后,我们就要将 PDF 封面渲染到主界面上:

label.setScaledContents(True) 使得图片可以充满 label。self.table.setCellWidget(self.x, self.y, label) 用来设置标签的行与列。最后确保每八个元素换行,换行后将列数清零。

PyQt5 从零开始制作 PDF 阅读器(一)

右键菜单

上面我们已经提到,如何将单元格与右键菜单绑定。

PyQt5 从零开始制作 PDF 阅读器(一)

本次教程中,右键菜单只有两项,分别为开始阅读(暂未实现),以及删除图书。

PyQt5 从零开始制作 PDF 阅读器(一)

接下来,让我们看如何删除图书:

首先维护一个 self.booklist ,里面储存无重复 PDF 文件地址。首先获取图书在 booklist 中的索引,在 booklist 中删除该元素。接着清空选中单元格之后(包含选中单元格)的所有单元格的内容。最后将 booklist 中 index 之后的图书地址重新显示到 table 上。简单地说,就是删除选中单元格,并将之后单元格向前挪一位。

PyQt5 从零开始制作 PDF 阅读器(一)