تصاویر خود را در PDF سازماندهی کنید و یاد بگیرید که چگونه از Tkinter برای ساخت این ابزار مفید استفاده کنید.
از گزارش های تجاری گرفته تا نمونه کارهای عکاسی، اغلب با نیاز به استفاده از تصاویر در فایل های PDF مواجه می شوید. یک مبدل تصویر به PDF می تواند به ساده سازی فرآیند کمک کند. در حالی که ابزارهای رایگان زیادی به صورت آنلاین در دسترس هستند، نیاز آنها به آپلود تصاویر ممکن است یک نگرانی حفظ حریم خصوصی یا امنیتی باشد.
در عوض، می توانید با استفاده از پایتون یک مبدل تصویر به PDF آفلاین بسازید. چندین تصویر را با فرمت JPG یا PNG انتخاب کنید، یک پیش نمایش دریافت کنید و با حفظ اندازه اصلی تصویر، آنها را به PDF تبدیل کنید.
ماژول Tkinter، Pillow و ReportLab
Tkinter کتابخانه استاندارد رابط کاربری گرافیکی برای پایتون است. ویجتهای مختلفی مانند دکمهها، برچسبها و جعبههای متن را ارائه میدهد که توسعه برنامههایی مانند پخشکننده موسیقی یا ابزار تبدیل وزن را آسان میکند. برای نصب Tkinter در سیستم خود، یک ترمینال را باز کنید و تایپ کنید:
pip install tkinter
ماژول Pillow یک کتابخانه تصویربرداری قدرتمند پایتون است که انجام عملیات روی تصاویر مانند تغییر اندازه، برش و فیلتر کردن را آسان می کند. با ادغام آن با OpenAI API و DALL·E 2، می توانید تصاویر را با استفاده از یک پیام متنی تولید کنید.
برای نصب Pillow این دستور را اجرا کنید:
pip install Pillow
ReportLab یک کتابخانه پایتون منبع باز برای تولید PDF و گرافیک است. دارای ابزارهای مختلفی است که می توانید از آنها برای تولید اسناد با تصاویر، متن و جداول استفاده کنید که تولید گزارش از طریق برنامه نویسی را مفید می کند. با این کار، می توانید گزارش های تجاری، فاکتورها و گواهی ها را بسازید و در عین حال یک واترمارک متنی نیز اضافه کنید. برای نصب ReportLab:
pip install reportlab
ساختار مبدل تصویر به PDF را تعریف کنید
شما می توانید کل کد منبع برای ساخت مبدل تصویر به PDF با استفاده از پایتون را در این مخزن GitHub پیدا کنید.
ماژول های لازم را وارد کرده و کلاسی به نام ImageToPDFConverter ایجاد کنید. یک متد سازنده تعریف کنید که کلاس را مقدار دهی اولیه می کند و شی پنجره ریشه Tkinter را به عنوان آرگومان می گیرد. یک لیست خالی را برای ذخیره مسیرهای تصاویری که کاربر انتخاب می کند، راه اندازی کنید. عنوان و ابعاد برنامه را تنظیم کنید. دو دکمه با نام های Select Images و Convert to PDF ایجاد کنید.
پنجرهای را که میخواهید دکمه را در آن قرار دهید، متنی که باید نمایش داده شود، فرمانی که باید هنگام کلیک کردن اجرا کنند و فرمت فونتی که باید اعمال کنند، ارسال کنید. دکمه ها را با استفاده از متد pack() سازماندهی کنید و در جهت عمودی به آنها یک بالشتک 10 بدهید.
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
class ImageToPDFConverter:
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)
یک برچسب را با عبور دادن آن در پنجره والد برای قرار دادن آن، متنی که باید نمایش دهد، قالب قلمی که باید استفاده کند و یک صفحه عمودی 10 (پیکسل) تعریف کنید.
به طور مشابه، یک قاب برای پیش نمایش تصویر انتخاب شده تعریف کنید و پنجره اصلی، عرض و ارتفاع آن را تنظیم کنید. آن را با یک پد 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)
انتخاب تصویر و ایجاد پیش نمایش
یک متد تعریف کنید () select_images. از کلاس filedialog Tkinter برای باز کردن یک کادر محاوره ای برای انتخاب چندین تصویر و ذخیره آنها در لیست images_path استفاده کنید. دایرکتوری اولیه ای که کادر محاوره ای باید باز شود، عنوانی که باید نمایش داده شود و انواع فایل هایی که اجازه انتخاب می دهد را ارسال کنید.
یک حلقه تعریف کنید که روی تمام مسیرهای تصاویری که کاربر انتخاب کرده است، تکرار شود. برای باز کردن فایل تصویر و انتقال حداکثر ابعادی که باید داشته باشد به روش تغییر اندازه از متد open() Pillow استفاده کنید. این تصویر PIL را به PhotoImage که با Tkinter سازگار است تبدیل کنید. برچسبی ایجاد کنید که در قاب پیش نمایشی که قبلا ایجاد کرده اید قرار گیرد و تصویر را نمایش دهید. از مدیر شبکه برای سازماندهی تصاویر در یک طرح شبکه با سه ستون استفاده کنید.
def select_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)
یک متد، resize_image() تعریف کنید که اندازه تصویر را با در نظر گرفتن ابعاد تصویر و حداکثر ابعادی که قبلاً تعریف کردهاید، تغییر میدهد. نسبت تصویر را محاسبه کنید و از آن برای تنظیم عرض و ارتفاع جدید استفاده کنید. از روش تغییر اندازه PIL برای تغییر اندازه تصویر با حفظ نسبت تصویر دست نخورده استفاده کنید. از درون یابی دو خطی به عنوان نمونه برداری مجدد برای نتیجه نرم تر استفاده کنید.
def resize_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
تبدیل تصاویر به PDF
یک تابع تعریف کنید، convert_to_pdf(). از filedialog برای درخواست مسیر مقصد برای PDF استفاده کنید. پسوند پیش فرض و نوع فایل را به صورت pdf. تنظیم کنید. از ماژول بوم ReportLab برای ترسیم یک صفحه افقی استفاده کنید. مسیر تصاویر را تکرار کنید، آنها را باز کنید، ابعاد صفحه PDF را مانند تصویر تنظیم کنید و تصویر را از گوشه بالا سمت چپ با ابعاد مشخص شده بکشید.
متد showPage() به PDF اجازه می دهد تا به صفحه بعدی منتقل شود. هنگامی که برنامه این فرآیند را کامل کرد، PDF را ذخیره کنید و یک جعبه پیام را به همراه مسیر نشان دهید.
def convert_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}")
پنجره ریشه Tkinter را ایجاد کنید و آن را به نمونه کلاس ارسال کنید. تابع mainloop() به پایتون می گوید که حلقه رویداد Tkinter را اجرا کند و تا زمانی که پنجره را ببندید به رویدادها گوش دهد.
if __name__ == "__main__":
root = tk.Tk()
app = ImageToPDFConverter(root)
root.mainloop()
همه کدها را کنار هم قرار دهید و تبدیل تصویر به PDF آماده استفاده است.
نمونه خروجی تبدیل تصاویر به PDF با استفاده از پایتون
هنگام اجرای برنامه، پنجره ای با دو دکمه و یک فضای خالی خواهید دید که به شما دستور انتخاب تصاویر را می دهد.
با کلیک بر روی دکمه انتخاب تصاویر، پنجره ای باز می شود که از شما می خواهد تصاویر را انتخاب کنید. شما می توانید هر تعداد تصویر را در هر ترکیبی انتخاب کنید.
هنگامی که تصاویر مورد نظر خود را انتخاب کردید، پیش نمایشی از آنها خواهید دید:
با کلیک بر روی دکمه تبدیل به PDF، می توانید نام و مسیری را که می خواهید فایل PDF را در آن ذخیره کنید، انتخاب کنید. هنگامی که برنامه تبدیل را به پایان رساند، یک جعبه پیام نشان می دهد که پی دی اف را ذخیره کرده و نام مسیر را به دنبال آن ذخیره کرده است. با باز کردن PDF متوجه خواهید شد که برنامه تصاویر را بدون تغییر ابعاد آنها تبدیل کرده است.
عملیات PDF که می توانید برای بهبود برنامه های خود اجرا کنید
شما می توانید یک برنامه PDF کامل بسازید که عملیاتی مانند ادغام، فشرده سازی، محافظت و باز کردن قفل فایل های PDF را انجام می دهد. شما می توانید یک ویژگی برای تقسیم PDF به چندین صفحه، چرخاندن آنها، حذف صفحات خاص، مرتب سازی آن و اضافه کردن شماره صفحات ایجاد کنید.
شما می توانید با سایر فرمت های فایل نیز برای تبدیل یک سند یا یک ارائه به PDF آزمایش کنید. چندین ماژول، مانند PyPDF2، PDFMiner، fpdf، و pdfrw، میتوانند به شما در دستیابی راحتتر به این موارد کمک کنند.