如何在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的不同元素。