파이썬을 활용한 다량의 영수증/이미지 파일 PDF 일괄 변환 방법

회사에 비용 정빙을 제출하거나 각종 보고서를 작성할 때, 스마트폰으로 촬영한 영수증이나 스캔한 여러 장의 이미지(JPG, PNG) 파일들을 하나의 PDF 문서로 묶어서 제출해야 하는 경우가 많습니다. 파일이 몇 개 없다면 웹사이트나 일반 뷰어 프로그램을 사용해도 되지만, 처리해야 할 영수증이 수십 장을 넘어가면 파일 하나하나 변환하고 정렬하는 과정에서 많은 시간이 낭비됩니다. 파이썬의 대표적인 이미지 처리 라이브러리인 필로우(Pillow)를 활용하면, 폴더 안에 무작위로 섞여 있는 대량의 이미지 파일들을 단 몇 초 만에 순서대로 정렬하여 깔끔한 단일 PDF 파일로 일괄 변환할 수 있습니다.

PDF 증빙 자료 제출을 위한 이미지 변환 자동화 필요성

Pillow(PIL) 라이브러리를 활용한 이미지 제어

파이썬에서 이미지를 다룰 때 가장 안정적이고 널리 사용되는 패키지가 바로 Pillow입니다. 과거 파이썬 이미지 표준 라이브러리였던 PIL(Python Imaging Library)의 후속 프로젝트로, 이미지 열기, 자르기, 크기 조정뿐만 아니라 서로 다른 포맷의 이미지를 결합하여 PDF 파일로 압축 인쇄하는 기능을 완벽하게 지원합니다. 수많은 파일 포맷을 코드로 제어할 수 있어 업무 자동화 시스템 구축 시 필수적으로 활용됩니다. 실습을 시작하기 전에 컴퓨터의 터미널 환경에서 아래 명령어를 통해 Pillow 라이브러리를 설치해 줍니다.

Bash

pip install Pillow

지정 폴더 내 JPG/PNG 파일을 하나의 PDF로 병합하는 코드

핵심 스크립트 구현 및 사용 방법

지정된 폴더를 탐색하여 사용자가 원하는 이미지 포맷들만 정확하게 골라내고, 이를 하나의 다중 페이지 PDF 문서로 병합해 주는 전체 파이썬 스크립트 코드입니다.

Python

import os
from PIL import Image

def convert_images_to_pdf(folder_path, output_pdf_name):
    # 폴더 내 모든 파일 목록 가져오기
    all_files = os.listdir(folder_path)
    
    # 지원할 이미지 확장자 정의 (대소문자 구분 없이 처리)
    valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff')
    
    # 확장자 조건에 맞는 이미지 파일만 필터링하여 리스트 생성
    image_files = [f for f in all_files if f.lower().endswith(valid_extensions)]
    
    # 일관성 있는 순서 결합을 위해 파일 이름 순으로 정렬
    image_files.sort()
    
    if not image_files:
        print("변환할 이미지 파일이 폴더 내에 존재하지 않습니다.")
        return
        
    print(f"총 {len(image_files)}개의 이미지 파일을 발견했습니다. PDF 변환을 시작합니다.")
    
    image_list = []
    
    for idx, file_name in enumerate(image_files):
        file_path = os.path.join(folder_path, file_name)
        try:
            # Pillow를 활용해 이미지 열기
            img = Image.open(file_path)
            
            # PDF 변환을 위해 이미지를 RGB 모드로 통일 (RGBA 모드 오류 방지)
            if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
                # 투명도 배경이 있는 png 등은 흰색 배경으로 채운 후 RGB 변환
                alpha = img.convert('RGBA')
                bg = Image.new('RGB', alpha.size, (255, 255, 255))
                bg.paste(alpha, mask=alpha.split()[3])
                img = bg
            else:
                img = img.convert('RGB')
                
            image_list.append(img)
            print(f"이미지 로드 완료 ({idx+1}/{len(image_files)}): {file_name}")
        except Exception as e:
            print(f"이미지 읽기 실패 ({file_name}): {e}")
            
    if image_list:
        # 최종 PDF 저장 경로 설정
        output_path = os.path.join(folder_path, output_pdf_name)
        
        # 첫 번째 이미지를 기준으로 삼고, 나머지 이미지들을 후속 페이지로 붙여서 저장
        first_image = image_list[0]
        rest_images = image_list[1:]
        
        first_image.save(output_path, save_all=True, append_images=rest_images)
        print(f"\n모든 파일의 PDF 병합 일괄 변환이 완료되었습니다.")
        print(f"최종 결과물: {output_path}")
    else:
        print("유효한 이미지 데이터가 없어 변환을 취소합니다.")

# 영수증 및 이미지 파일들이 모여있는 폴더 경로와 결과 PDF 파일명 설정
target_folder = r"C:\Your\Receipt\Images\Path"
result_pdf = "영수증_증빙_일괄취합본.pdf"

if __name__ == "__main__":
    convert_images_to_pdf(target_folder, result_pdf)

이 코드는 단순 변환을 넘어 배경이 투명한 PNG 이미지나 특정 모드의 파일이 섞여 있을 때 발생하는 PDF 인쇄 에러를 원천 차단하기 위해 RGB 모드 자동 변환 예외 처리가 포함되어 있습니다. image_files.sort()를 통해 이미지 파일명 규칙대로 정렬된 순서대로 PDF 페이지가 차례차례 생성됩니다. 하단의 target_folder 경로 변수에 정리가 필요한 영수증 이미지들이 보관된 디렉터리 경로를 지정하고 스크립트를 구동하면, 수십 장의 영수증이 완벽하게 결합된 하나의 마스터 PDF 보고서가 깔끔하게 생성됩니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤