使用python代码实现 PDF 阅读器

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

本文章来自腾讯云 作者:Python进阶者

想要学习Python?有问题得不到第一时间解决?来看看这里“1039649593”满足你的需求,资料都已经上传至文件中,可以自行下载!还有海量最新2020python学习资料。
点击查看

书籍

使用 Book 类来保存书籍信息,比如元数据、页数以及阅读与否的信息。通过 eq 特殊方法,来判断两个 book 实例是否为同一对象。

class Book:    def __init__(self, fname):        # 文件名        self.fname = fname        # 是否被阅读        self.flag = None        self._info = None        self._page = 0        self.get_meta_data(self.fname)    def __eq__(self, other):        if hasattr(other, 'fname'):            return self.fname == other.fname        return False

同时阅读

通过内部维护一个 read_list 列表来实现同时阅读多本书。列表储存 book 对象,每个 book 对象都有一个 page 属性。这样,我们的程序就能记住每本书被翻到的页数了。

第二行代码,是对 read_list 进行初始化。book.flag 用来判断这本书上次关闭前是否处于阅读的状态。如果是,我们就把它放在阅读列表中。

self.read_list = [None]self.read_list.extend(book for book in self.booklist if book.flag)

左键翻页
我们重写 MyArea 类的 mousePressEvent 方法。event.pos() 函数用来获取鼠标的坐标,x() 用来获取横坐标。

width 为 MyArea 区域的宽度,如果点击鼠标左键,且鼠标位置的横坐标小于 1/3 区域宽度,那么向前翻页;大于 2/3 区域宽度,那么向后翻页。

# 鼠标左键翻页def mousePressEvent(self, event):    pos = event.pos().x()    width = self.size().width()    if event.button() == Qt.LeftButton:        if pos > width * 2 / 3:            self.right()        elif pos < width / 3:            self.left()sqlite3

sqlite3 是轻量型本地数据库,具有无服务器、零配置、速度快等特点。

PyReadon 启动时,会从数据库中读取图书信息。read_db 函数主要执行以下功能:

如果路径中不存在 PDF.db 数据库,那么就新建 PDF.db 数据库,并且创建一个 book_info 表格,该表格拥有三个属性 path, page, flag;

从 book_info 表格中读取数据,并创建 book 对象来接收这些数据,最后通过 yield 函数返回 book 对象。

book_db = 'PDF.db'book_info = namedtuple('info',  'path page flag')def read_db():    # 将路径更改为该文件所处路径    os.chdir(os.path.dirname(os.path.realpath(__file__)))    if not os.path.exists(book_db):        conn = sqlite3.connect(book_db)        conn.execute("CREATE TABLE book_info(path, page, flag)")        conn.close()    conn = sqlite3.connect(book_db)    for row in conn.execute('SELECT * FROM book_info'):        info = book_info(*row)        book = Book(info.path)        book.page = info.page        book.flag = info.flag        yield book    conn.close()

将数据存储到数据库中:

将书籍列表传给 save2db 函数,通过列表推导式创建 book 所在地址的列表。conn.executemany 函数将迭代生成器表达式,并获得 书籍地址、阅读页数、是否在阅读列表中 等信息,最后将这些信息存储在数据库中。

def save2db(booklist):    conn = sqlite3.connect(book_db)    conn.executemany("INSERT INTO book_info Values (?,?,?)",                ((book.fname, book.page, book.flag) for book in booklist))    conn.commit()    conn.close()

在进行存储数据之前,我们首先要将 book_info 数据库中的内容清空。

def remove_db():    conn = sqlite3.connect(book_db)    conn.execute('DELETE FROM book_info')    conn.commit()    conn.close()

查看书籍信息

书籍支持查看右键菜单,我们使用 QMessageBox.about 函数来显示书籍信息。

elif action == item3:    index = row_num * 8   col_num    # 之后改成 book    book = self.booklist[index]    info = book.info    fmt = f'路径:{info.path}\n\n'         f'格式:{info.format}\n\n'         f'标题:{info.title}\n\n'         f'作者:{info.author}\n\n'         f'Creator:{info.creator}\n\n'         f'Producer:{info.producer}\n\n'    QMessageBox.about(self, '文档信息', fmt)

弹窗

通过 Qt Designer 设计了一个弹窗,并与主程序绑定:

info 即为弹窗,点击工具栏中的信息栏时会弹出窗口。

info = Info()reader.infobar.triggered.connect(info.show)

来源:https://www.icode9.com/content-1-827051.html

(0)

相关推荐

  • YYDS! Python 帮我扛起运营大旗!

    来源:Python 技术「ID: pythonall」 最近参加了一个训练营,作为副教练,承担起训练营的运营工作.事不大,活不少,打卡记录.活动积分.奖励制度.评优方案.趋势对比,应有尽有-- 开始认 ...

  • conn_sqlite.py

    #!/usr/bin/python import sqlite3 """ 常用模块,读写sqlite """ def get_conn(db ...

  • PyQt5 从零开始制作一个 PDF 阅读器

    大家好,欢迎来到 Crossin的编程教室 ! 今天,我们分享一个开发实例:用 Python 的 PyQt5 库制作带 UI 界面的 PDF 阅读器. 这篇文章介绍了如何创建主界面,以及添加.删除图书 ...

  • 如何做中文文本的情感分析?

    这是本学期在大数据哲学与社会科学实验室做的第三次分享了.第一次分享的是:如何利用"wordcloud+jieba"制作中文词云?第二次分享的是:如何爬取知乎中问题的回答以及评论的数 ...

  • 最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)

    最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)

  • 用 Python 制作商品历史价格查询

    来源:Python 技术「ID: pythonall」 一年一度的双十一就快到了,各种砍价.盖楼.挖现金的口令将在未来一个月内充斥朋友圈.微信群中.玩过多次双十一活动的小编表示一顿操作猛如虎,一看结果 ...

  • 小姨开水果店的,所以今天用Python写了一个水果店小系统!

    前言 今天晚上才刚下班,小姨就提了我最爱吃的榴莲过来,说不吃就坏了. 我一眼就看破了她的用意,哈哈哈  我这个小姨也是一起长大的,她心里的小九九  我在清楚不过了!肯定是有求于我!  然后就直接问他有 ...

  • 极速PDF阅读器 for Mac——闪电般好用的的PDF阅读器

    Mac版极速PDF阅读器体积小.启动速度快,十分轻巧且占用内存极少:提供单页.书本模式个性阅读,又有全屏.幻灯片等功能助您随心切换:独有的目录提取.精准搜索功能让您阅读更轻松,更省事.(地址:http ...

  • Foxit Reader v9.3.0 福昕PDF阅读器中文去广告优化版

    Foxit Reader(原名Foxit PDF Reader)是福建阜新软件学院开发的一套读取PDF文件的软件.Foxit Reader是一套免费使用的软件,操作系统以微软Windows为主,可以在 ...

  • 建立私人定制资料库、专业PDF阅读器、轻松制作个性地图 | 今天有什么?

     产品皆活物 · 用者无机心 Airtable -  建立私人定制资料库 Airtable 是一款新型的在线表格制作工具 .它可以把文字 .图片 .链接 .文档等各种资料聚合在一起 ,帮你建立私人定制 ...

  • 【兼容M1】Skim for Mac - 优秀的PDF阅读器

    Skim for Mac(PDF阅读器)是一款Mac平台上的PDF阅读器软件.skim mac版它旨在帮助您阅读和注释PDF中的科学论文,适合查看任何PDF文件.你可以使用Skim打开PDF文档,甚至 ...

  • 再见PDF提取收费!我用100行Python代码搞定!

    第471篇原创干货,第一时间送达 大家在日常的工作和学习过程中,都少不了与PDF文件打交道,很多的小伙伴都面临着将PDF文件中的文字.图片和表格数据提取出来的问题.能够对PDF文件中的文字.表格等数据 ...

  • 牛逼!40行Python代码一键把html网页保存为pdf,太方便了!

    作者丨菜鸟哥 来源丨菜鸟学Python(ID:cainiao_xueyuan) 最近临近开学了,大家都在忙着准备各种学习的资料,准备在新的学期好好学习,充实自己.小编身边的同学也是如此,最近,小编的同 ...

  • 4个使阅读 Python 代码更容易的函数

    #技术派的书架# 引言 当一个程序变大时,读取代码就变成了一项困难的工作.即使是一些简单的任务也会很困难.例如: 如何检查一个大型函数或类的所有变量名和值? 如何获得特定对象的有效属性列表? 如何快速 ...

  • 推荐一个“极速PDF在线阅读器”

    最近个人职业出现危机,白天也无电脑可用,远方一位知己送我一台三星超薄笔记本电脑以作工作之用.由于超薄笔记本内存有限,不想安装太多软件,而pdf又是必须的阅读器,所以就在网上度啊!度啊!度 ,就想度到一 ...