Bạn có thể dễ dàng xây dựng một trình chuyển đổi ảnh sang PDF bằng Python. Dưới đây là hướng dẫn chi tiết.
Mô đun Tkinter, Pillow và ReportLab
Tkinter là thư viện GUI chuẩn dành cho Python. Nó cung cấp một loạt widget như nút bấm, nhãn dán, hộp văn bạn khiến việc phát triển app như phát nhạc hay chuyển đổi văn bản trở nên dễ dàng. Để cài Tkinter trong hệ thống, mở terminal và gõ:
pip install tkinter
Mô đun Pillow là một thư viện ảnh Python mạnh mẽ, khiến nó dễ dàng triển khai các hoạt động trên ảnh như chỉnh lại kích thước, cắt và lọc. Tích hợp nó với OpenAI API và DALL·E 2, bạn có thể tạo ảnh bằng lời nhắc văn bản.
Để cài Pillow, chạy lệnh này:
pip install Pillow
ReportLab là thư viện Python mã nguồn mở để tạo PDF và đồ họa. Nó có nhiều công cụ khác nhau cho bạn sử dụng để tạo tài liệu kèm ảnh, text và bảng. Chúng hữu ích cho việc tạo báo cáo qua lập trình. Nhờ đó, bạn có thể xây dựng báo cáo công ty, hóa đơn và chứng chỉ, đồng thời thêm logo mờ dạng text. Để cài ReportLab:
pip install reportlab
Xác định cấu trúc công cụ chuyển đổi ảnh sang PDF
Nhập các mô-đun cần thiết và tạo một lớp có tên ImageToPDFConverter. Định nghĩa một phương thức khởi tạo để tạo lớp và lấy đối tượng cửa sổ gốc của Tkinter làm đối số. Khởi tạo một danh sách trống để lưu trữ đường dẫn của các hình ảnh mà người dùng chọn. Đặt tiêu đề và kích thước của ứng dụng. Tạo hai nút có tên Select Images và Convert to PDF.
Chuyển cửa sổ mà bạn muốn đặt nút vào, nội dung trên nút sẽ hiển thị. Đó là lệnh mà nút sẽ thực thi khi được nhấp và định dạng phông chữ mà nút sẽ áp dụng. Sắp xếp các nút bằng cách sử dụng phương thức pack() & cung cấp cho chúng phần padding là 10 theo chiều dọc.
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)
Xác định một nhãn bằng cách chuyển nhãn đó sang cửa sổ chính để đặt label vào, nội dung trên nó sẽ hiển thị, định dạng phông chữ nhãn sẽ dùng và khoảng padding dọc 10 (pixel).
Tương tự, xác định một khung để xem trước hình ảnh đã chọn và đặt cửa sổ chính, chiều rộng và chiều cao của nó. Sắp xếp nó với phần padding là 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)
Chọn ảnh và tạo cửa sổ xem trước
Xác định một phương thức, select_images(). Sử dụng lớp filedialog của Tkinter để mở hộp thoại chọn nhiều hình ảnh và lưu trữ chúng trong danh sách images_path. Chuyển thư mục ban đầu mà hộp thoại sẽ mở, tiêu đề sẽ hiển thị và loại tệp mà hộp thoại cho phép lựa chọn.
Xác định một vòng lặp lặp lại trên tất cả các đường dẫn của hình ảnh mà người dùng đã chọn. Sử dụng phương thức open() của Pillow để mở tệp hình ảnh và chuyển kích thước tối đa cần có cho phương thức thay đổi kích thước. Chuyển đổi hình ảnh PIL này sang PhotoImage tương thích với Tkinter. Tạo một nhãn nằm trong khung xem trước mà bạn đã làm trước đó và hiển thị hình ảnh. Sử dụng trình quản lý grid để sắp xếp các hình ảnh theo bố cục dạng kẻ ô có ba cột.
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)
Xác định một phương thức, resize_image() để thay đổi kích thước hình ảnh, bao gồm kích thước của hình ảnh và kích thước tối đa mà bạn đã xác định trước đó. Tính toán tỷ lệ khung hình và sử dụng nó để đặt chiều rộng và chiều cao mới. Sử dụng phương pháp thay đổi kích thước của PIL để thay đổi kích thước hình ảnh giữ nhưng vẫn nguyên tỷ lệ khung hình. Sử dụng phép nội suy song tuyến tính để làm lại mẫu cho kết quả mượt mà hơn.
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
Chuyển đổi ảnh sang PDF
Định nghĩa một hàm, convert_to_pdf(). Sử dụng filedialog để hỏi đường dẫn đích cho tệp PDF. Đặt phần mở rộng và loại tệp mặc định là .pdf. Sử dụng mô-đun canvas của ReportLab để vẽ trang ngang. Lặp lại đường dẫn của hình ảnh, mở chúng, đặt kích thước của trang PDF giống với kích thước của hình ảnh và vẽ hình ảnh từ góc trên cùng bên trái với kích thước đã chỉ định.
Phương thức showPage() cho phép PDF chuyển sang trang tiếp theo. Sau khi chương trình hoàn tất quá trình này, hãy lưu tệp PDF và hiển thị hộp thông báo cùng với đường dẫn.
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}")
Tạo cửa sổ gốc Tkinter và chuyển nó vào trường class. Hàm mainloop() yêu cầu Python chạy vòng lặp sự kiện Tkinter và lắng nghe các sự kiện cho đến khi bạn đóng cửa sổ.
if __name__ == "__main__":
root = tk.Tk()
app = ImageToPDFConverter(root)
root.mainloop()
Đặt toàn bộ code lại với nhau và công cụ chuyển đổi ảnh thành PDF đã sẵn sàng sử dụng.