Organisera dina bilder till PDF-filer och lär dig hur du använder Tkinter för att bygga detta praktiska verktyg.

Från affärsrapporter till fotograferingsportföljer kommer du ofta att stöta på ett behov av att använda bilder i PDF-filer. En bild-till-PDF-omvandlare kan hjälpa till att effektivisera processen. Även om det finns många gratisverktyg tillgängliga online, kan deras behov av att ladda upp bilder vara ett integritets- eller säkerhetsproblem.

Istället kan du bygga en offlinebild-till-PDF-omvandlare med Python. Välj flera bilder i JPG- eller PNG-format, få en förhandsgranskning och konvertera dem till en PDF med bibehållen originalbildstorlek.

Modulen Tkinter, Pillow och ReportLab

Tkinter är standard GUI-biblioteket för Python. Den erbjuder en mängd olika widgets som knappar, etiketter och textrutor som gör det enkelt att utveckla appar som musikspelare eller ett viktkonverteringsverktyg. För att installera Tkinter i ditt system, öppna en terminal och skriv:

pip install tkinter

Pillow-modulen är ett kraftfullt Python-bildbibliotek som gör det enkelt att utföra operationer på bilder som storleksändring, beskärning och filtrering. Att integrera detta med

instagram viewer
OpenAI API och DALL·E 2, du kan generera bilder med hjälp av en textprompt.

För att installera Pillow, kör detta kommando:

pip install Pillow

ReportLab är ett Python-bibliotek med öppen källkod för att generera PDF-filer och grafik. Den har olika verktyg du kan använda för att generera dokument med bilder, text och tabeller vilket gör det användbart att generera rapporter via programmering. Med detta kan du skapa affärsrapporter, fakturor och certifikat samtidigt lägga till en textvattenstämpel. Så här installerar du ReportLab:

pip install reportlab

Definiera strukturen för bild-till-PDF-konverteraren

Du kan hitta hela källkoden för att bygga bild-till-PDF-omvandlaren med Python i denna GitHub-förråd.

Importera de nödvändiga modulerna och skapa en klass med namnet ImageToPDFConverter. Definiera en konstruktormetod som initierar klassen och tar Tkinters rotfönsterobjekt som ett argument. Initiera en tom lista för att lagra sökvägarna till bilderna som användaren väljer. Ställ in applikationens titel och mått. Skapa två namngivna knappar Välj Bilder och Konvertera till PDF.

Passera fönstret du vill placera knappen i, texten de ska visa, kommandot som de ska köra när de klickas på och typsnittsformatet de ska tillämpa. Organisera knapparna med hjälp av packa() metod och ge dem en stoppning på 10 i vertikal riktning.

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)

Definiera en etikett genom att skicka den till det överordnade fönstret att placera den i, texten den ska visa, typsnittsformatet den ska använda och en vertikal utfyllnad på 10 (pixlar).

Definiera på samma sätt en ram för att förhandsgranska den valda bilden och ställa in dess överordnade fönster, bredd och höjd. Organisera det med en stoppning 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)

Välja bilden och skapa en förhandsvisning

Definiera en metod, select_images(). Använd Tkinter's fildialog klass för att öppna en dialogruta för att välja flera bilder och lagra dem i images_path lista. Skicka den första katalogen som dialogrutan ska öppnas, titeln den ska visa och filtyperna som den tillåter val.

Definiera en loop som itererar över alla vägar för bilderna som användaren valt. Använd kuddar öppen() metod för att öppna bildfilen och skicka den maximala dimensionen den bör ha till storleksändringsmetoden. Konvertera denna PIL-bild till PhotoImage som är kompatibel med Tkinter. Skapa en etikett som finns i förhandsgranskningsramen du skapade tidigare och visa bilden. Använd rutnät manager för att organisera bilderna i en rutnätslayout med tre kolumner.

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)

Definiera en metod, resize_image() som ändrar storleken på bilden med hänsyn till bildens dimension och den maximala dimensionen du definierade tidigare. Beräkna bildförhållandet och använd det för att ställa in den nya bredden och höjden. Använd PIL: s storleksändringsmetod för att ändra storlek på bilden och bibehålla bildförhållandet intakt. Använd bilinjär interpolation som omsampling för ett jämnare 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

Konvertera bilderna till PDF

Definiera en funktion, convert_to_pdf(). Använd fildialogrutan för att fråga efter destinationssökvägen för PDF: en. Ställ in standardtillägg och filtyp som .pdf. Använd ReportLabs canvasmodul för att rita en liggande sida. Iterera över bildernas bana, öppna dem, ställ in måtten på PDF-sidan på samma sätt som bildens och rita bilden från det övre vänstra hörnet med de angivna måtten.

De showPage() metoden gör att PDF: en kan flyttas till nästa sida. När programmet har slutfört denna process, spara PDF-filen och visa en meddelanderuta tillsammans med sökvägen.

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}")

Skapa Tkinter-rotfönstret och skicka det till klassinstansen. De mainloop() funktionen säger åt Python att köra Tkinter-händelsslingan och lyssna efter händelser tills du stänger fönstret.

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

Sätt ihop all kod och bild-till-PDF-konverteraren är klar att använda.

Exempel på utdata för att konvertera bilder till PDF med Python

När du kör appen kommer du att se ett fönster med två knappar och ett tomt utrymme som instruerar dig att välja bilderna.

När du klickar på Välj Bilder knappen, dyker ett fönster upp som ber dig att välja bilderna. Du kan välja valfritt antal bilder i valfri kombination.

När du har valt dina önskade bilder ser du en förhandsvisning av dem:

När du klickar på knappen Konvertera till PDF kan du välja namnet och sökvägen där du vill lagra PDF-filen. När programmet har slutfört konverteringen, visar det en meddelanderuta som säger att det har sparat PDF-filen följt av sökvägens namn. När du öppnar PDF-filen kommer du att upptäcka att programmet har konverterat bilderna utan att ändra deras mått.

PDF-operationer du kan implementera för att förbättra dina applikationer

Du kan bygga ett fullfjädrat PDF-program som utför operationer som att slå samman, komprimera, skydda och låsa upp PDF-filer. Du kan skapa en funktion för att dela upp PDF-filen i flera sidor, rotera dem, ta bort särskilda sidor, sortera den och lägga till sida tal.

Du kan experimentera med andra filformat också för att konvertera ett dokument eller en presentation till PDF. Flera moduler, som PyPDF2, PDFMiner, fpdf och pdfrw, kan hjälpa dig att uppnå dessa mer bekvämt.