여러 이미지 PDF 변환 반복하기: 파이썬(Python) 코드로 쉽게 자동화하기

이전 포스트에서 여러 이미지 PDF 변환 방법을 확인해 보셨나요? 오늘은 조금 더 한발짝 나가보도록 하겠습니다. 특정폴더의 하부폴더(A)에서 여러 이미지 PDF 파일로 만들고 난 뒤, 그 특정폴더에 다른 하부폴더(B)에 또 다른 이미지들이 있을 때 어떻게 하면 될까요? 만약 특정폴더에 PDF 파일을 이미 만들어 놓은 폴더와 그러지 않은 폴더가 섞여 있으면 그 폴더별 PDF 변환 작업을 어떻게 해야 할까요? 제가 적어놓고 보니 말이 너무 어렵네요. 아래 내용을 보면서 무슨 말인지 확인해 보시기 바랍니다.

여러 이미지 PDF 변환 포스트 그림

코드 설명: Python을 사용한 여러 이미지 PDF 변환

이 코드에서는 PillowReportLab 라이브러리를 사용하여 여러 이미지 PDF 변환 작업을 자동화합니다. 이미지 처리와 PDF 생성 과정에서, 디렉토리 구조를 탐색하여 여러 개의 이미지를 각각 PDF로 변환할 수 있습니다.

여러 이미지 PDF 변환 포스트 그림

1. 필요한 파이썬 라이브러리 불러오기

import os
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import portrait

첫 번째 단계는 필요한 라이브러리들을 불러오는 것입니다. 여기서는 os, PILImage, 그리고 ReportLabcanvasportrait 페이지 크기 옵션을 사용합니다.

  • os: 디렉토리 내 파일 탐색 및 경로 생성.
  • Pillow (PIL): 이미지 파일을 열고 처리.
  • ReportLab: PDF 파일을 생성하고 이미지 삽입.

2. 이미지 처리 함수 작성

def process_images(c, dir_path):
    img_list = sorted([img_name for img_name in os.listdir(dir_path) if img_name.endswith(".png")])
    if img_list:
        for img_name in img_list[1:]:
            img_path = os.path.join(dir_path, img_name)
            img = Image.open(img_path)
            img_width, img_height = img.size
            c.setPageSize((img_width, img_height))
            c.showPage()
            c.drawInlineImage(img_path, 0, 0, width=img_width, height=img_height)

이 함수는 이미지 파일을 처리하여 PDF로 변환하는 핵심 부분입니다.

  1. img_list: 주어진 디렉토리에서 “.png” 파일만 가져와 정렬합니다.
  • os.listdir(dir_path)는 디렉토리 내 모든 파일을 가져오고, if img_name.endswith(".png") 조건을 통해 PNG 파일만 선택합니다.
  • 이미지 파일 열기: 이미지 경로를 생성한 후 Image.open()을 사용해 이미지를 엽니다.
  • 페이지 크기 설정: setPageSize()로 이미지 크기에 맞는 페이지 크기를 설정합니다.
  • 이미지 추가: drawInlineImage()를 사용해 이미지를 PDF 페이지에 삽입합니다.
  • showPage(): 페이지를 완료하고 새로운 페이지를 준비합니다.

    이 과정을 통해 각 PNG 파일이 하나의 PDF 페이지로 변환됩니다.

    3. 디렉토리 내 서브디렉토리 처리

    def process_subdirs(main_dir, output_dir):
        for subdir in os.listdir(main_dir):
            subdir_path = os.path.join(main_dir, subdir)
            if os.path.isdir(subdir_path):
                for second_subdir in os.listdir(subdir_path):
                    second_subdir_path = os.path.join(subdir_path, second_subdir)
                    if os.path.isdir(second_subdir_path):
                        pdf_path = os.path.join(output_dir, subdir, f"{second_subdir}.pdf")
                        if not os.path.exists(pdf_path):
                            os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
                            c = canvas.Canvas(pdf_path, pagesize=None)
                            process_images(c, second_subdir_path)
                            c.save()
                            print(f"생성된 PDF 파일: {pdf_path}")

    이 함수는 주어진 메인 디렉토리 내의 모든 서브디렉토리를 처리하여 각 디렉토리별로 PDF 파일을 생성하는 역할을 합니다.

    1. os.listdir(): 메인 디렉토리와 서브디렉토리 내 파일들을 리스트로 가져옵니다.
    • os.path.isdir() 조건을 통해 디렉토리인지 확인.
    • PDF 파일 경로 생성: os.path.join()으로 PDF 파일 경로를 생성하고, 이미 존재하지 않는 경우에만 PDF 파일을 생성합니다.
    • PDF 생성 및 저장: Canvas 객체를 생성하여, process_images() 함수로 이미지를 처리한 후 PDF 파일을 저장합니다.
    • os.makedirs(): PDF 파일을 저장할 폴더가 없으면 생성합니다.

      이 함수는 디렉토리 구조를 탐색하며, 각 서브디렉토리에서 PNG 파일들을 PDF로 변환하는 작업을 자동으로 수행합니다.

      4. 메인 함수 호출

      main_dir = "C:\\Users\\user\\Documents\\Book"
      output_dir = "C:\\Users\\user\\Documents\\Book_pdf"
      process_subdirs(main_dir, output_dir)

      마지막으로, 주어진 경로에서 PDF 변환 작업을 실행합니다.

      1. main_dir: 이미지를 포함한 메인 디렉토리 경로.
      2. output_dir: PDF 파일이 저장될 경로.
      3. process_subdirs() 함수가 호출되어, 메인 디렉토리 내 모든 이미지를 변환하고 PDF로 저장합니다.

      전체 파이썬 코드

      import os
      from PIL import Image
      from reportlab.pdfgen import canvas
      from reportlab.lib.pagesizes import portrait
      
      def process_images(c, dir_path):
          img_list = sorted([img_name for img_name in os.listdir(dir_path) if img_name.endswith(".png")])
          if img_list:
              for img_name in img_list[1:]:
                  img_path = os.path.join(dir_path, img_name)
                  img = Image.open(img_path)
                  img_width, img_height = img.size
                  c.setPageSize((img_width, img_height))
                  c.showPage()
                  c.drawInlineImage(img_path, 0, 0, width=img_width, height=img_height)
      
      def process_subdirs(main_dir, output_dir):
          for subdir in os.listdir(main_dir):
              subdir_path = os.path.join(main_dir, subdir)
              if os.path.isdir(subdir_path):
                  for second_subdir in os.listdir(subdir_path):
                      second_subdir_path = os.path.join(subdir_path, second_subdir)
                      if os.path.isdir(second_subdir_path):
                          pdf_path = os.path.join(output_dir, subdir, f"{second_subdir}.pdf")
                          if not os.path.exists(pdf_path):  # 이미 생성된 PDF 파일이 없는 경우에만 실행
                              os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
                              c = canvas.Canvas(pdf_path, pagesize=None)
                              process_images(c, second_subdir_path)
                              c.save()
                              print(f"생성된 PDF 파일: {pdf_path}")
      
      # 시작점
      main_dir = "C:\\Users\\user\\Documents\\Book"
      output_dir = "C:\\Users\\user\\Documents\\Book_pdf"
      process_subdirs(main_dir, output_dir)

      이 코드는 여러 디렉토리 내 PNG 이미지 파일을 찾아 PDF로 변환하는 과정을 자동화합니다. 이제 여러분도 Python을 사용하여 여러 이미지 PDF 변환 작업을 효율적으로 처리할 수 있습니다!

      # 추가 설명

      파이썬 코드를 위주로 해서 제가 원하는 작업을 설명하려니 더 어렵게 느껴질 수도 있을 것 같아서 추가적으로 내용을 적어봅니다. 예를 들면, A폴더 하위에 1, 2, 3… 서브폴더가 있다고 하고, B폴더 하위에 똑같이 1, 2, 3… 서브폴더가 있습니다. A폴더의 각각 서브폴더에는 png 이미지 파일들이 있어서 위 작업을 하고 나면 B폴더의 각각 동일한 폴더명에 여러 이미지가 하나의 pdf 파일로 만들어지게 됩니다.

      그런데, 이미 B폴더에 pdf 파일이 만들어진 A폴더의 이미지를 삭제하지 않고 그대로 둔다고 하면 위와 같은 작업을 진행할 때 pdf 파일이 만들어진 A폴더의 서브폴더는 건너뛰어야 하도록 Python 코딩을 해야 합니다. 위 전체 코드에서 ‘#이미 생성된 PDF 파일이 없는 경우에만 실행‘이란 부분이 이 역할을 하게 됩니다. 이제 폴더별로 여러 이미지 PDF 변환 작업을 쉽게 가능하시리라 생각합니다.

      유사한 게시물