728x90
728x90
여러장의 이미지 파일을 pdf로 만드는 건 인터넷을 뒤져보면 많은 곳에서 서비스를 하고있습니다.

이러한 사이트를 이용할 때 불편함을 느끼는 경우가 많습니다.
첫째, 개인정보가 담긴 이미지을 사용할 경우 보안에 대한 걱정이 생깁니다.
둘째, 이미지 장수 제한이나 변환 횟수 제한으로 사용에 제약이 생기며, 결국 유료 결제를 유도하기도 합니다.
이러한 불편함 없이, 간단하고 자유롭게 이미지를 PDF로 변환할 수 있는 방법을 소개해 보겠습니다.
coding
스캔한 이미지를 도서 별로 압축하고, 해당 압축 파일을 선택하여 압축 파일이 있는 위치에 PDF를 생성합니다.
변환 과정에서 진행도가 출력되도록 하여 사용자에게 진행 상황을 명확히 보여줍니다.
여러 개의 압축 파일을 한 번에 선택해 PDF로 변환할 수 있도록 하여 효율성을 높였습니다.
import zipfile
import os
from PIL import Image
from tkinter import Tk, filedialog
import sys
import shutil
def convert_images_in_zip_to_pdf(zip_path, output_pdf_path):
# 임시 디렉토리 생성
temp_dir = "temp_images"
if not os.path.exists(temp_dir):
os.makedirs(temp_dir)
# 압축 파일 열기
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(temp_dir)
# 이미지 파일들 가져오기
image_files = [os.path.join(temp_dir, f) for f in os.listdir(temp_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif'))]
total_files = len(image_files)
# 이미지 파일들을 로드하여 PDF로 변환
images = []
for idx, file in enumerate(sorted(image_files)):
# 진행도 출력
progress = (idx + 1) / total_files * 100
sys.stdout.write(f"\rProcessing images: {progress:.2f}% complete")
sys.stdout.flush()
img = Image.open(file)
# 이미지가 'RGB' 모드가 아니면 변환
if img.mode != 'RGB':
img = img.convert('RGB')
images.append(img)
# 첫 번째 이미지를 기준으로 PDF 생성
if images:
images[0].save(output_pdf_path, save_all=True, append_images=images[1:])
else:
print("No images found in the zip file.")
# 임시 디렉토리 삭제
shutil.rmtree(temp_dir)
Tk().withdraw() # GUI 창 숨기기
initial_dir = 'D:\\' if os.path.exists('D:\\') else None
zip_paths = filedialog.askopenfilenames(title="Select ZIP Files", filetypes=[("ZIP files", "*.zip")], initialdir=initial_dir) # 여러 압축 파일 선택
if zip_paths:
total_zips = len(zip_paths)
for idx, zip_path in enumerate(zip_paths):
# 압축 파일별 진행도 출력
print(f"\nProcessing ZIP file {idx + 1} of {total_zips}: {zip_path}")
output_pdf_path = os.path.splitext(zip_path)[0] + ".pdf" # 출력 PDF 파일 경로를 압축 파일 경로와 동일하게 설정
convert_images_in_zip_to_pdf(zip_path, output_pdf_path)
print(f"\nPDF 파일이 성공적으로 '{output_pdf_path}'에 저장되었습니다.")
else:
print("압축 파일을 선택하지 않았습니다.")
728x90
728x90
'etc.' 카테고리의 다른 글
스크린 캡처 방지 가이드: 안드로이드, iOS, 그리고 윈도우에서의 구현 방법 (0) | 2024.11.08 |
---|---|
한 번에 스캔한 두 페이지 이미지, 간편하게 분할하기 (Feat. vFlat) (0) | 2024.11.07 |
라즈베리파이 공유기 만들기 (Routed Wireless Access Point) (0) | 2022.08.08 |
지그재그 지그비 zigbee (0) | 2022.07.10 |
개발자를 위한 구글링 팁 (0) | 2021.11.11 |