複数の画像のPDF変換を繰り返す:Python(Python)コードで簡単に自動化する

前の投稿で複数の画像をPDFに変換する方法を確認しましたか?今日はもう少し一歩進んでみましょう。 特定のフォルダのサブフォルダ(A)で複数の画像PDFファイルに作成した後、その特定のフォルダに別のサブフォルダ(B)に別の画像がある場合はどうすればよいでしょうか?もし、特定のフォルダにPDFファイルを既に作っておいたフォルダとそうでないフォルダが混在している場合、そのフォルダごとにPDF変換作業をどのようにすべきでしょうか?私が書いておいてみると、言葉があまりにも難しいですね。 下の内容を見ながら、何を言っているのか確認してください。

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

コード説明: Pythonを使用して複数の画像をPDFに変換する方法

このコードでは レポートラボ ライブラリを使用して、複数の画像のPDF変換作業を自動化します。画像処理とPDF生成の過程で、ディレクトリ構造を参照し、複数の画像をそれぞれPDFに変換することができます。

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

1.必要なPythonライブラリを読み込みます。

インポートOS
from PIL import Image
from reportlab.pdfgen import canvas
reportlab.lib.pagesizes from reportlab.lib.pagesizes import portrait

最初のステップは、必要なライブラリを呼び出すことです。 ここでは、必要なライブラリは os, PILイメージそして レポートラボキャンバス および 肖像画 ページサイズオプションを使用します。

  • OS(オペレーティングシステム).NET.NET.NET.NET:ディレクトリ内のファイル探索とパス生成。
  • 枕(PIL)画像ファイルを開いて処理します。
  • レポートラボ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ファイルが1つの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として保存します。

      完全なPythonコード

      インポートOS
      from PIL import Image
      from reportlab.pdfgen import canvas
      reportlab.lib.pagesizes 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変換作業を効率的に処理することができます!

      # 追加説明

      Pythonコードを中心に私がしたい作業を説明しようとしたら、もっと難しく感じるかもしれないので、追加で内容を書いてみます。例えば、Aフォルダの下に1,2,3...サブフォルダがあるとして、Bフォルダの下に同じように1,2,3...サブフォルダがあります。Aフォルダの各サブフォルダにはpng画像ファイルがあるので、上の作業をしたら、Bフォルダのそれぞれ同じフォルダ名に複数の画像が一つのpdfファイルに作成されます。

      ところで、すでにBフォルダにpdfファイルが作成されたAフォルダの画像を削除せずにそのまま残す場合、上記のような作業を進める時、pdfファイルが作成されたAフォルダのサブフォルダはスキップするようにPythonコーディングをする必要があります。上の全体コードで'#すでに生成されたPDFファイルがない場合のみ実行'という部分がこの役割をすることになります。これで、フォルダごとに複数の画像をPDFに変換する作業が簡単にできると思います。

      類似の投稿