중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날
"영수증 10장을 스마트폰으로 찍었는데 회계팀에는 PDF 한 개로 보내야 한다", "계약서를 스캔 앱으로 여러 장 찍었는데 순서대로 하나의 문서로 만들어야 한다", "제품 사진 여러 장을 카탈로그처럼 PDF 한 권으로 정리하고 싶다"…
사진 여러 장을 PDF 하나로 합치는 작업은 온라인 변환 사이트를 이용할 수도 있지만, 파일을 업로드하고 순서를 맞추고 다운로드하는 과정이 매번 번거롭고 민감한 문서라면 외부 사이트 업로드가 꺼려질 수 있습니다. 파이썬을 한 번만 세팅해두면 폴더 안의 이미지를 파일명 순서대로 자동 정렬해 PDF로 합치고, 페이지 크기도 자동으로 맞춰줍니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
이미지-PDF 변환에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install pillow
pillow는 이미지를 읽고 처리하는 라이브러리인 동시에, 여러 이미지를 하나의 PDF로 저장하는 기능도 기본으로 지원합니다. 별도의 PDF 전용 라이브러리 없이 이 하나로 충분합니다.
💡 이 코드로 할 수 있는 것: 폴더 안의 jpg, png 이미지를 파일명 순서대로 자동 정렬해 하나의 PDF로 합칩니다. 이미지 크기가 제각각이어도 페이지 크기를 자동으로 맞춰주고, PNG의 투명 배경도 흰 배경으로 자동 변환해 PDF 저장 오류를 방지합니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, images_to_pdf.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from PIL import Image
from pathlib import Path
# ① 설정
INPUT_FOLDER = r"C:\Users\내이름\Desktop\영수증사진" # ← 이미지가 있는 폴더
OUTPUT_PDF = r"C:\Users\내이름\Desktop\영수증_합본.pdf" # ← 저장할 PDF 경로
SORT_BY = "name" # ← "name": 파일명 순서 / "date": 촬영(수정)일 순서
# ② 지원 확장자
SUPPORTED = {".jpg", ".jpeg", ".png", ".bmp"}
# ③ 이미지 파일 목록 수집 및 정렬
folder = Path(INPUT_FOLDER)
images = [f for f in folder.iterdir()
if f.is_file() and f.suffix.lower() in SUPPORTED]
if SORT_BY == "date":
images.sort(key=lambda f: f.stat().st_mtime)
else:
images.sort(key=lambda f: f.name)
print(f" 📂 합칠 이미지: {len(images)}개")
for i, img in enumerate(images, 1):
print(f" {i}. {img.name}")
if not images:
print("⚠ 이미지 파일을 찾을 수 없습니다. INPUT_FOLDER 경로를 확인하세요.")
else:
# ④ 이미지 열기 및 RGB 변환 (PDF는 RGBA 저장 불가)
pil_images = []
for img_path in images:
img = Image.open(img_path)
if img.mode in ("RGBA", "P"):
# 투명 배경을 흰 배경으로 변환
background = Image.new("RGB", img.size, (255, 255, 255))
if img.mode == "P":
img = img.convert("RGBA")
background.paste(img, mask=img.split()[-1] if img.mode == "RGBA" else None)
img = background
else:
img = img.convert("RGB")
pil_images.append(img)
# ⑤ 첫 번째 이미지를 기준으로 나머지를 이어붙여 PDF 저장
first_image = pil_images[0]
rest_images = pil_images[1:]
first_image.save(
OUTPUT_PDF,
save_all=True,
append_images=rest_images,
resolution=150.0, # 해상도 (DPI), 높일수록 선명하지만 용량 증가
)
pdf_size_mb = round(Path(OUTPUT_PDF).stat().st_size / 1024 / 1024, 2)
print(f"\n✅ 완료! {len(images)}장 → PDF 저장 ({pdf_size_mb}MB) → {OUTPUT_PDF}")
01_표지.jpg, 02_본문.jpg처럼 숫자 접두어로 정리하는 것을 권장합니다.INPUT_FOLDER와 OUTPUT_PDF 경로를 입력합니다.python images_to_pdf.py
정상 실행 시 터미널에 이렇게 출력됩니다:
📂 합칠 이미지: 4개
1. 01_영수증_커피.jpg
2. 02_영수증_문구.jpg
3. 03_영수증_교통.jpg
4. 04_영수증_식대.jpg
✅ 완료! 4장 → PDF 저장 (2.1MB) → C:\Users\내이름\Desktop\영수증_합본.pdf
생성된 PDF를 열어보면 이미지 순서대로 페이지가 구성되어 있고, 각 이미지 크기에 맞춰 페이지 크기도 자동으로 조정되어 있습니다.
오류 1: 순서가 예상과 다르게 나옴
파일명 기준 정렬(SORT_BY = "name")은 문자열 순서로 정렬되기 때문에, 파일명이 "1, 2, ..., 10, 11"처럼 숫자 뒤에 자릿수가 다르면 "1, 10, 11, 2, 3..." 순으로 잘못 정렬될 수 있습니다. 파일명을 01, 02, ..., 10, 11처럼 앞자리를 0으로 채운 두 자리 이상으로 통일하면 해결됩니다.
오류 2: OSError: cannot write mode RGBA as PDF
코드에 이미 RGBA(투명 배경) 이미지를 RGB로 변환하는 처리가 포함되어 있습니다. 그래도 오류가 난다면 이미지 파일 자체가 손상되었을 가능성이 있으니 해당 이미지를 다른 뷰어로 열어보세요.
오류 3: PDF 용량이 너무 큼
고해상도 사진 여러 장을 그대로 합치면 PDF 용량이 커집니다. resolution 값을 100 이하로 낮추거나, 이미지 자동 리사이즈 편으로 원본 이미지를 먼저 줄인 뒤 PDF로 합치는 것을 권장합니다.
합쳐진 PDF에 페이지 번호를 함께 넣고 싶다면, 이 블로그의 PDF 도장·텍스트 삽입 편에서 소개한 워터마크 코드를 이어서 적용하면 됩니다. 이 글의 결과 PDF를 그 코드의 INPUT_PDF로 지정해서 실행하면 됩니다.
💡 이전 게시글과 결합하면: PDF 자동 병합 편과 결합하면 이미지로 만든 PDF와 기존 PDF 문서를 하나로 합칠 수 있고, PDF 자동 압축 편과 결합하면 완성된 PDF의 용량을 추가로 줄일 수 있습니다.
이 코드를 응용하면 이미지마다 여백을 균일하게 맞추거나, 표지 이미지만 다른 크기로 처리하는 것도 가능합니다.