-
img2pdfPython/이것저것 파이썬 2024. 11. 5. 13:15반응형
폴더 내 jpg 파일을 모아서 PDF로 만들어주는 파이썬 코드입니다.
이렇게 깔끔하게 처리해 주는 프로그램이 없어서 코딩해 보았습니다.
다행히 제가 원하는 기능을 가진 라이브러리가 있었네요.img2pdf : https://pypi.org/project/img2pdf/
항상 무손실입니다: PDF에 내장된 이미지는 항상 모든 픽셀에 대해 입력과 정확히 동일한 색상 정보를 갖습니다.
작습니다: 가능한 경우 입력 이미지와 출력 PDF 사이의 파일 크기 차이는 PDF 컨테이너 자체의 오버헤드일 뿐입니다.
빠릅니다: 가능하면 입력 이미지를 CPU가 픽셀 데이터를 다시 인코딩하지 않고 그대로 PDF 문서에 붙여 넣습니다.pip install img2pdf
from pathlib import Path from pprint import pprint from img2pdf import convert def main(): path = Path(r'D:\...\jpg') images = sorted(path.glob('*.jpg')) pprint(images) with open(path / 'out.pdf', 'wb') as f: pdf = convert(images) f.write(pdf) if __name__ == '__main__': main()
[코딩 팁]
1. os 라이브러리보다 pathlib가 더 편합니다.
'경로 문자열'을 Path()로 객체로 바꿔준 뒤,
경로를 객체로 다루는 방식입니다.재미있는 아이디어인데요...
'/'(나누기) 연산자를 이용해서 path를 join 할 수 있습니다. -0-;
연산자 재정의(overator overloading)를 이용한 거 같은데
이건 좀 엄청난 문법적 설탕 같기도 하고 파이써닉한 것 같기도 하고...
2. 윈도의 path를 문자열로 다룰 때
'\'가 이스케이프 문자로 사용되기 때문에 오류가 발생합니다.
'\\'로 바꿔주는 방법이 있지만, 너무 귀찮죠.
파이썬에서는 문자열 앞에 raw의 의미인 r을 붙이면
이스케이프 문자를 사용하지 않기 때문에 정상적으로 인식 됩니다.GUI로 작성해 본다면...
chatGPT에게 부탁하면...import tkinter as tk from tkinter import filedialog, messagebox from pathlib import Path from img2pdf import convert def select_folder(): folder_selected = filedialog.askdirectory() if folder_selected: folder_path.set(folder_selected) update_file_list() def update_file_list(*args): folder = Path(folder_path.get()) if not folder: return extension = file_extension.get() images = sorted(folder.glob(f'*{extension}')) file_listbox.delete(0, tk.END) # Clear the current list # if not images: # messagebox.showwarning("Warning", f"No {extension} images found in the selected folder.") # return for img in images: file_listbox.insert(tk.END, img.name) def convert_images_to_pdf(): folder = folder_path.get() if not folder: messagebox.showerror("Error", "Please select a folder containing images.") return extension = file_extension.get() path = Path(folder) images = sorted(path.glob(f'*{extension}')) if not images: messagebox.showerror("Error", f"No {extension} images found in the selected folder.") return output_file = path / 'out.pdf' with open(output_file, 'wb') as f: pdf = convert(images) f.write(pdf) messagebox.showinfo("Success", f"PDF file created successfully: {output_file}") # Create the main window root = tk.Tk() root.title("Image to PDF Converter") # StringVar to store the selected folder path folder_path = tk.StringVar() # StringVar to store the selected file extension file_extension = tk.StringVar(value='.jpg') # Create and place widgets tk.Label(root, text="Select a folder containing images:").pack(pady=10) tk.Entry(root, textvariable=folder_path, width=50).pack(padx=10) tk.Button(root, text="Browse", command=select_folder).pack(pady=5) tk.Label(root, text="Select image file extension:").pack(pady=5) extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff'] # Updated extensions list extension_menu = tk.OptionMenu(root, file_extension, *extensions) extension_menu.pack(pady=5) tk.Label(root, text="Image Files:").pack(pady=5) # Frame to contain the listbox and scrollbar list_frame = tk.Frame(root) list_frame.pack(padx=10, pady=5) # Create and place the listbox and scrollbar file_listbox = tk.Listbox(list_frame, width=50, height=10) scrollbar = tk.Scrollbar(list_frame, orient=tk.VERTICAL, command=file_listbox.yview) file_listbox.config(yscrollcommand=scrollbar.set) file_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) tk.Button(root, text="Convert to PDF", command=convert_images_to_pdf).pack(pady=20) # Bind the update_file_list function to the file_extension variable file_extension.trace_add("write", update_file_list) # Run the application root.mainloop()
반응형