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

    xiaoxiao2023-10-21  183

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    python免费学习资料以及群交流解答点击即可加入

    效果图

    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 上。简单地说,就是删除选中单元格,并将之后单元格向前挪一位。

    最新回复(0)