Organiser bildene dine i PDF-filer og lær hvordan du bruker Tkinter til å bygge dette hendige verktøyet.

Fra forretningsrapporter til fotografiporteføljer, vil du ofte støte på et behov for å bruke bilder i PDF-filer. En bilde-til-PDF-konverterer kan bidra til å strømlinjeforme prosessen. Selv om det er mange gratisverktøy tilgjengelig på nettet, kan deres behov for å laste opp bilder være et personvern- eller sikkerhetsproblem.

I stedet kan du bygge en offline bilde-til-PDF-konverterer ved å bruke Python. Velg flere bilder i JPG- eller PNG-format, få en forhåndsvisning og konverter dem til en PDF mens du beholder den opprinnelige bildestørrelsen.

Tkinter-, pute- og ReportLab-modulen

Tkinter er standard GUI-biblioteket for Python. Den tilbyr en rekke widgets som knapper, etiketter og tekstbokser som gjør det enkelt å utvikle apper som musikkspiller eller et vektkonverteringsverktøy. For å installere Tkinter i systemet ditt, åpne en terminal og skriv inn:

pip install tkinter

Pillow-modulen er et kraftig Python-bildebibliotek som gjør det enkelt å utføre operasjoner på bilder som å endre størrelse, beskjære og filtrere. Integrerer dette med

OpenAI API og DALL·E 2, kan du generere bilder ved hjelp av en tekstmelding.

For å installere Pillow, kjør denne kommandoen:

pip install Pillow

ReportLab er et åpen kildekode Python-bibliotek for å generere PDF-er og grafikk. Den har ulike verktøy du kan bruke til å generere dokumenter med bilder, tekst og tabeller som gjør det nyttig å generere rapporter via programmering. Med dette kan du bygge forretningsrapporter, fakturaer og sertifikater samtidig legge til et tekstvannmerke. Slik installerer du ReportLab:

pip install reportlab

Definer strukturen til bilde-til-PDF-konvertereren

Du kan finne hele kildekoden for å bygge bilde-til-PDF-konverteren ved å bruke Python i denne GitHub-depot.

Importer de nødvendige modulene og lag en klasse med navn ImageToPDFConverter. Definer en konstruktørmetode som initialiserer klassen og tar Tkinters rotvinduobjekt som et argument. Initialiser en tom liste for å lagre banene til bildene brukeren velger. Angi tittel og dimensjoner for applikasjonen. Lag to knapper med navn Velg Bilder og Konverter til PDF.

Pass på vinduet du vil plassere knappen i, teksten de skal vise, kommandoen de skal utføre når de klikkes, og skriftformatet de skal bruke. Organiser knappene ved å bruke pakke() metode og gi dem en polstring på 10 i vertikal retning.

import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
from reportlab.lib.pagesizes import landscape
from reportlab.pdfgen import canvas

classImageToPDFConverter:
def__init__(self, root):
self.root = root
self.image_paths = []
self.root.title("Image to PDF Converter")
self.root.geometry("750x600")
self.select_images_button = tk.Button(self.root, text="Select Images", command=self.select_images, font=("Helvetica", 12),)
self.select_images_button.pack(pady=10)
self.convert_to_pdf_button = tk.Button(self.root, text="Convert to PDF", command=self.convert_to_pdf, font=("Helvetica", 12),)
self.convert_to_pdf_button.pack(pady=10)

Definer en etikett ved å sende den til det overordnede vinduet den skal plasseres i, teksten den skal vise, skriftformatet den skal bruke og en vertikal utfylling på 10 (piksler).

På samme måte definerer du en ramme for å forhåndsvise det valgte bildet og angi dets overordnede vindu, bredde og høyde. Organiser den med en polstring på 10.

 self.select_images_label = tk.Label(self.root, text="Select Images", font=("Helvetica", 14))
self.select_images_label.pack(pady=10)
self.preview_frame = tk.Frame(self.root, width=380, height=200)
self.preview_frame.pack(pady=10)

Velge bildet og lage en forhåndsvisning

Definer en metode, select_images(). Bruk Tkinter's fildialog klasse for å åpne en dialogboks for å velge flere bilder og lagre dem i images_path liste. Send den første katalogen dialogboksen skal åpne, tittelen den skal vise, og filtypene den tillater valg.

Definer en sløyfe som itererer over alle banene til bildene brukeren valgte. Bruk Pillow's åpen() metode for å åpne bildefilen og overføre den maksimale dimensjonen den skal ha til endringsmetoden. Konverter dette PIL-bildet til PhotoImage som er kompatibel med Tkinter. Lag en etikett som ligger i forhåndsvisningsrammen du opprettet tidligere, og vis bildet. Bruke Nett leder for å organisere bildene i et rutenettoppsett med tre kolonner.

defselect_images(self):
self.image_paths = filedialog.askopenfilenames(initialdir="/", title="Select Images", filetypes=(("Image Files", "*.jpg *.png"),))

for i, image_path in enumerate(self.image_paths):
image = Image.open(image_path)
image = self.resize_image(image, width=150, height=150)
photo = ImageTk.PhotoImage(image)
label = tk.Label(self.preview_frame, image=photo)
label.image = photo
label.grid(row=i // 3, column=i % 3, padx=10, pady=10)

Definer en metode, endre størrelse_bilde() som endrer størrelsen på bildet med tanke på bildets dimensjon og den maksimale dimensjonen du definerte tidligere. Beregn sideforholdet og bruk det til å angi den nye bredden og høyden. Bruk PILs resize-metode for å endre størrelsen på bildet mens du holder sideforholdet intakt. Bruk bilineær interpolering som resampling for et jevnere resultat.

defresize_image(self, image, width, height):
aspect_ratio = min(width / float(image.size[0]), height / float(image.size[1]))
new_width = int(aspect_ratio * image.size[0])
new_height = int(aspect_ratio * image.size[1])
resized_image = image.resize((new_width, new_height), resample=Image.Resampling.BILINEAR)
return resized_image

Konvertering av bildene til PDF

Definer en funksjon, konverter_til_pdf(). Bruk fildialogen til å be om målbanen for PDF-filen. Angi standardutvidelse og filtype som .pdf. Bruk ReportLabs lerretsmodul til å tegne en liggende side. Iterer over banen til bildene, åpne dem, sett dimensjonene til PDF-siden til den samme som bildets, og tegn bildet fra øverste venstre hjørne med de spesifiserte dimensjonene.

De showPage() metoden lar PDF-filen gå til neste side. Når programmet har fullført denne prosessen, lagrer du PDF-en og viser en meldingsboks sammen med banen.

defconvert_to_pdf(self):
pdf_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=(("PDF Files", "*.pdf"),))
c = canvas.Canvas(pdf_path, pagesize=landscape)
for image_path in self.image_paths:
image = Image.open(image_path)
width, height = image.size
c.setPageSize((width, height))
c.drawImage(image_path, 0, 0, width=width, height=height)
c.showPage()
c.save()
messagebox.showinfo("Conversion Successful", f"PDF saved at {pdf_path}")

Lag Tkinter-rotvinduet og send det til klasseforekomsten. De mainloop() funksjonen forteller Python å kjøre Tkinter-hendelsesløkken og lytte etter hendelser til du lukker vinduet.

if __name__ == "__main__":
root = tk.Tk()
app = ImageToPDFConverter(root)
root.mainloop()

Sett all koden sammen og bilde-til-PDF-konverteren er klar til bruk.

Eksempel på utdata for konvertering av bilder til PDF ved hjelp av Python

Når du kjører appen, vil du se et vindu med to knapper og et tomt område som ber deg velge bildene.

Ved å klikke på Velg Bilder -knappen, dukker det opp et vindu som ber deg velge bildene. Du kan velge et hvilket som helst antall bilder i en hvilken som helst kombinasjon.

Når du har valgt bildene du ønsker, vil du se en forhåndsvisning av dem:

Når du klikker på Konverter til PDF-knappen, kan du velge navnet og banen der du vil lagre PDF-filen. Når programmet er ferdig med konverteringen, viser det en meldingsboks som sier at det har lagret PDF-filen etterfulgt av banenavnet. Når du åpner PDF-en vil du finne at programmet har konvertert bildene uten å endre dimensjonene.

PDF-operasjoner du kan implementere for å forbedre applikasjonene dine

Du kan bygge et fullverdig PDF-program som utfører operasjoner som å slå sammen, komprimere, beskytte og låse opp PDF-filer. Du kan bygge en funksjon for å dele opp PDF-en i flere sider, rotere dem, fjerne bestemte sider, sortere den og legge til side tall.

Du kan også eksperimentere med andre filformater for å konvertere et dokument eller en presentasjon til PDF. Flere moduler, som PyPDF2, PDFMiner, fpdf og pdfrw, kan hjelpe deg med å oppnå disse mer praktisk.