1. 程式人生 > 實用技巧 >使用python程式碼實現 PDF 閱讀器

使用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)