如何在Tkinter GUI Python中新增PDF?


本文將教我們如何在Tkinter GUI中顯示PDF檔案。我們將使用PyMuPDF庫讀取pdf檔案並將其轉換為影像,然後使用Tkinter顯示。

為了完成我們的任務,我們將執行以下步驟:

  • 讀取PDF檔案。

  • 定義一個變換矩陣,將其應用於PDF頁面以獲取其影像。

  • 計算總頁數以進行錯誤檢查。

  • 為我們的GUI定義螢幕(畫布)。

  • 定義一個輔助函式,用於將PDF頁面轉換為PIL影像。

  • 定義一個函式,在我們的GUI中顯示頁面的影像。

  • 新增按鈕、標籤、捲軸等並配置它們。

首先,讓我們在終端中執行以下命令來安裝PyMuPDF包。

python -m pip install --upgrade pip
python -m pip install --upgrade pymupdf

現在我們需要匯入我們將要使用的庫。import fitz

import fitz
from tkinter import *
from PIL import Image, ImageTk

這裡的fitz是一個與PyMuPDF庫一起提供的實用程式庫,用於將PDF頁面作為影像獲取。

我們首先使用fitz.open函式開啟要在GUI中顯示的PDF檔案。這將返回一個文件物件,可用於訪問頁面。

# open pdf file
file_name = "sample.pdf"
doc = fitz.open(file_name)

現在我們需要指定我們希望如何檢視頁面。透過定義下面的矩陣函式,我們讓`fitz`保持1倍縮放。

# transformation matrix we can apply on pages
zoom = 1
mat = fitz.Matrix(zoom, zoom)

讓我們也計算一下頁數:

# count number of pages
num_pages = 0
for p in doc:
num_pages += 1

現在,我們將定義一個螢幕,並向我們的程式碼中新增一個捲軸和一個畫布:

# initialize and set screen size
root = Tk()
root.geometry('750x700')

# add scroll bar
scrollbar = Scrollbar(root)
scrollbar.pack(side = RIGHT, fill = Y)

# add canvas
canvas = Canvas(root, yscrollcommand = scrollbar.set)
canvas.pack(side = LEFT, fill = BOTH, expand = 1)

這裡我們的螢幕由名稱“root”表示,尺寸為750x700。我們還添加了一個捲軸,並將其指定為位於右側並填充整個高度。類似地,我們將畫布新增到左側,並在兩側填充整個螢幕!

為了接收使用者想要閱讀的頁碼,我們需要將頁碼作為輸入。我們可以這樣做:

# define entry point (field for taking inputs)
entry = Entry(root)
# add a label for the entry point
label = Label(root, text="Enter page number to display:")

引數“root”告訴我們這些物件將與螢幕“root”關聯。

現在,我們將定義一個輔助函式來從頁碼獲取PDF檔案的影像。

def pdf_to_img(page_num):
page = doc.load_page(page_num)
pix = page.get_pixmap(matrix=mat)
return Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

這裡我們首先使用doc.load_page載入頁面並將頁碼作為引數傳遞。然後,我們在第二行轉換PDF頁面以獲取該頁面的畫素表示。最後,我們將畫素表示轉換為PIL影像格式。

現在我們定義一個函式show_image來在我們的Tkinter GUI中顯示影像。

def show_image():
try:
page_num = int(entry.get()) - 1
assert page_num >= 0 and page_num < num_pages
im = pdf_to_img(page_num)
img_tk = ImageTk.PhotoImage(im)
frame = Frame(canvas)
panel = Label(frame, image=img_tk)
panel.pack(side="bottom", fill="both", expand="yes")
frame.image = img_tk
canvas.create_window(0, 0, anchor='nw', window=frame)
frame.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))
except:
pass

這裡,我們首先從前面定義的入口點讀取頁碼並將其轉換為整數。如果它不是有效的整數,則會發生異常,異常塊會處理它。然後,我們檢查頁碼是否在0到頁數之間,因為這是我們可以顯示的唯一有效頁碼範圍。然後,使用我們之前定義的輔助函式,我們獲取使用者指定頁面的PIL影像。然後,我們設定框架、面板和畫布以適當地顯示此影像。

接下來,我們新增一個按鈕來顯示頁面。我們將函式`show_image`作為命令傳遞。因此,每當按下按鈕時,都會呼叫`show_image`函式。

# add button to display pages
button = Button(root, text="Show Page", command=show_image)

現在,我們設定前面定義的各種元件的可視位置:

# set visual locations
label.pack(side=TOP, fill=None)
entry.pack(side=TOP, fill=BOTH)
button.pack(side=TOP, fill=None)

我們還將初始頁面設定為PDF的第一頁,如下所示:

entry.insert(0, '1')
show_image()

我們配置捲軸

scrollbar.config(command = canvas.yview)
root.mainloop()

最後,我們關閉PDF,以免我們的電腦損壞它。

doc.close()

輸出

執行程式後,我們將看到以下輸出!

結論

本文教我們如何使用PyMuPDF庫以及Pillow和Tkinter在Tkinter GUI中顯示PDF檔案。我們還了解了如何計算頁數、將PDF頁面轉換為影像、製作互動式按鈕以及如何視覺化放置構成GUI的不同元素。

更新於:2023年3月23日

4K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告