1140221-PDF & HEIC 轉 JPG 工具
1140221-pdfandheictojpg-chatgpt-03.py
import os
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
from pdf2image import convert_from_path
from pillow_heif import register_heif_opener, open_heif
from PIL import Image
# 註冊 HEIF 格式支持
register_heif_opener()
def convert_pdf_to_jpg(pdf_path, output_folder, log_widget):
try:
file_name = os.path.basename(pdf_path).rsplit('.', 1)[0]
log_widget.insert(tk.END, f"正在處理 PDF 檔案:{file_name}\n")
pages = convert_from_path(pdf_path, poppler_path=r'C:\poppler\Library\bin')
for idx, page in enumerate(pages):
output_file = os.path.join(output_folder, f"{file_name}_{idx+1}.jpg")
page.save(output_file, 'JPEG')
log_widget.insert(tk.END, f"已完成第 {idx+1}/{len(pages)} 頁\n")
log_widget.insert(tk.END, f"完成轉換:{file_name}\n\n")
except Exception as e:
log_widget.insert(tk.END, f"轉換失敗:{pdf_path}\n錯誤訊息:{e}\n\n")
def convert_heic_to_jpg(input_path, output_folder, log_widget):
try:
file_name = os.path.basename(input_path).rsplit('.', 1)[0]
log_widget.insert(tk.END, f"正在處理 HEIC 檔案:{file_name}\n")
heif_image = open_heif(input_path)
image = Image.frombytes(heif_image.mode, heif_image.size, heif_image.data, "raw")
output_file = os.path.join(output_folder, f"{file_name}.jpg")
image.save(output_file, "JPEG")
log_widget.insert(tk.END, f"完成轉換:{file_name}\n\n")
except Exception as e:
log_widget.insert(tk.END, f"轉換失敗:{input_path}\n錯誤訊息:{e}\n\n")
def convert_single_pdf(log_widget):
pdf_path = filedialog.askopenfilename(filetypes=[('PDF files', '*.pdf')])
if not pdf_path:
return
output_folder = os.path.dirname(pdf_path)
convert_pdf_to_jpg(pdf_path, output_folder, log_widget)
def convert_pdf_folder(log_widget):
folder_path = filedialog.askdirectory()
if not folder_path:
return
pdf_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.pdf')]
if not pdf_files:
messagebox.showwarning("警告", "選取的資料夾中沒有 PDF 檔案!")
return
for pdf in pdf_files:
convert_pdf_to_jpg(pdf, folder_path, log_widget)
log_widget.insert(tk.END, "所有 PDF 檔案已處理完成!\n")
def convert_single_heic(log_widget):
file_path = filedialog.askopenfilename(filetypes=[("HEIC Files", "*.heic")])
if file_path:
output_folder = os.path.dirname(file_path)
convert_heic_to_jpg(file_path, output_folder, log_widget)
def convert_heic_folder(log_widget):
folder_path = filedialog.askdirectory()
if not folder_path:
return
heic_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith(".heic")]
if not heic_files:
messagebox.showinfo("提示", "該資料夾內沒有 HEIC 檔案。")
return
for heic in heic_files:
convert_heic_to_jpg(heic, folder_path, log_widget)
log_widget.insert(tk.END, "所有 HEIC 檔案已處理完成!\n")
def create_ui():
window = tk.Tk()
window.title("PDF & HEIC 轉 JPG 工具")
window.geometry("700x600")
label_title = tk.Label(window, text="PDF & HEIC 轉 JPG 工具", font=("Arial", 16))
label_title.pack(pady=10)
log_widget = scrolledtext.ScrolledText(window, wrap=tk.WORD, height=20, width=80)
log_widget.pack(padx=10, pady=10)
frame = tk.Frame(window)
frame.pack(pady=10)
btn_single_pdf = tk.Button(frame, text="轉換單一 PDF", command=lambda: convert_single_pdf(log_widget), height=2, width=20)
btn_folder_pdf = tk.Button(frame, text="轉換 PDF 資料夾", command=lambda: convert_pdf_folder(log_widget), height=2, width=20)
btn_single_heic = tk.Button(frame, text="轉換單一 HEIC", command=lambda: convert_single_heic(log_widget), height=2, width=20)
btn_folder_heic = tk.Button(frame, text="轉換 HEIC 資料夾", command=lambda: convert_heic_folder(log_widget), height=2, width=20)
btn_single_pdf.grid(row=0, column=0, padx=10, pady=5)
btn_folder_pdf.grid(row=0, column=1, padx=10, pady=5)
btn_single_heic.grid(row=1, column=0, padx=10, pady=5)
btn_folder_heic.grid(row=1, column=1, padx=10, pady=5)
note_label = tk.Label(window, text="Copyright Ⓒ2025 ME", font=("Arial", 14), fg="blue")
note_label.place(relx=0.99, rely=0.99, anchor='se')
window.mainloop()
if __name__ == "__main__":
create_ui()