Maison > Article > développement back-end > Comment ajouter un PDF dans Tkinter GUI Python ?
Cet article nous apprendra comment afficher les fichiers PDF dans l'interface graphique de Tkinter. Nous utiliserons la bibliothèque PyMuPDF pour lire le fichier pdf et le convertir en image, puis utiliserons Tkinter pour afficher l'image.
Pour notre tâche, nous effectuerons les étapes suivantes -
Lisez les fichiers PDF.
Définissez une matrice de transformation à appliquer à la page PDF pour obtenir l'image.
Calculez le nombre total de pages pour vérifier les erreurs.
Définissez l'écran (toile) de l'interface graphique.
Définissez une fonction d'assistance pour convertir les pages PDF en images PIL.
Définissez une fonction pour afficher l'image de la page dans l'interface graphique.
Ajoutez des boutons, des étiquettes, des barres de défilement, etc. et configurez-les.
Tout d'abord, nous exécutons d'abord la commande suivante dans le terminal pour installer le package PyMuPDF.
python -m pip install --upgrade pip python -m pip install --upgrade pymupdf
Nous devons maintenant importer les bibliothèques que nous utiliserons. Importer Fitz
import fitz from tkinter import * from PIL import Image, ImageTk
Le fitz ici est une bibliothèque d'utilitaires fournie avec la bibliothèque PyMuPDF pour obtenir des pages PDF sous forme d'images.
Nous utilisons d'abord la fonction fitz.open pour ouvrir le fichier PDF à afficher dans l'interface graphique. Cela renvoie un objet document qui peut être utilisé pour accéder à la page.
# open pdf file file_name = "sample.pdf" doc = fitz.open(file_name)
Maintenant, nous devons préciser comment afficher la page. En définissant la fonction matricielle ci-dessous, nous pouvons « ajuster » pour maintenir une mise à l'échelle 1x.
# transformation matrix we can apply on pages zoom = 1 mat = fitz.Matrix(zoom, zoom)
Comptons aussi le nombre de pages -
# count number of pages num_pages = 0 for p in doc: num_pages += 1
Nous allons maintenant définir un écran, ajouter une barre de défilement et un canevas à notre code -
# 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)
Ici notre écran est représenté par le nom "root" et a des dimensions de 750x700. Nous avons également ajouté une barre de défilement et précisé qu'elle soit à droite et remplisse toute la hauteur. Encore une fois, nous ajoutons la toile à gauche et remplissons tout l'écran des deux côtés !
Afin de recevoir le numéro de page que l'utilisateur souhaite lire, nous avons besoin du numéro de page en entrée. Nous pouvons le faire -
# 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:")
Le paramètre "root" nous indique que ces objets seront associés à l'écran "root".
Nous allons maintenant définir une fonction d'assistance pour obtenir l'image du fichier PDF à partir du numéro de page.
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)
Ici, nous chargeons d'abord la page en utilisant doc.load_page et passons le numéro de page en paramètre. Nous convertissons ensuite la page PDF pour obtenir la représentation en pixels de la page sur la deuxième ligne. Enfin, nous convertissons la représentation en pixels au format d'image PIL.
Maintenant, nous définissons une fonction show_image pour afficher les images dans l'interface graphique de Tkinter.
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
Tout d'abord, nous lisons le numéro de page à partir du point d'entrée précédemment défini et le convertissons en entier. S'il ne s'agit pas d'un entier valide, une exception se produit et le bloc d'exception la gère. Nous vérifions ensuite si le numéro de page est compris entre 0 ou le numéro de page, car c'est la seule plage de pages valide que nous pouvons afficher. Ensuite, en utilisant la fonction d'assistance que nous avons définie précédemment, nous obtenons l'image PIL de la page spécifiée par l'utilisateur. Nous configurons ensuite le cadre, le panneau et la toile pour afficher correctement l'image.
Ensuite, nous ajoutons un bouton pour afficher la page. Nous passons la fonction "show_image" en commande. Ainsi, chaque fois que le bouton est enfoncé, la fonction "show_image" est appelée.
# add button to display pages button = Button(root, text="Show Page", command=show_image)
Maintenant, nous définissons la position visuelle des différents composants que nous avons définis précédemment -
# set visual locations label.pack(side=TOP, fill=None) entry.pack(side=TOP, fill=BOTH) button.pack(side=TOP, fill=None)
Nous définissons également la page initiale comme étant la première page du PDF comme suit -
entry.insert(0, '1') show_image()
Nous configurons la barre de défilement
scrollbar.config(command = canvas.yview) root.mainloop()
Enfin, nous fermons le PDF pour éviter qu'il ne soit endommagé par notre ordinateur.
doc.close()
Après avoir exécuté le programme, nous verrons le résultat suivant !
Cet article nous apprend comment afficher des fichiers PDF dans l'interface graphique de Tkinter en utilisant la bibliothèque PyMuPDF avec Pillow et Tkinter. Nous avons également appris à compter les pages, à convertir des pages PDF en images, à créer des boutons interactifs et à placer visuellement les différents éléments qui composent une interface graphique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!