PDF結合

pythonと自動化

  1. HOME
  2. PDF結合

PDFファイルを編集ソフトなしで結合

PDFを操作するライブラリーPyPDF2をコマンドラインよりインストールしておきます。

PDFファイルを結合

pip install pypdf2

結合用の作業ファイルを作成し、「pdf_files」というフォルダの中に結合させたいPDFファイルを入れておく

from heapq import merge
from pathlib import Path
import PyPDF2

# フォルダのPDFファイル一覧
pdf_dir = Path("./pdf_files")
pdf_files = sorted(pdf_dir.glob("*.pdf"))

# 1つのPDFファイルへ
pdf_join = PyPDF2.PdfFileWriter()
for pdf_file in pdf_files:
    pdf_reader = PyPDF2.PdfFileReader(str(pdf_file))
    for i in range(pdf_reader.getNumPages()):
        pdf_join.addPage(pdf_reader.getPage(i))

# 保存ファイル名
merged_file = pdf_files[0].stem + "-" + pdf_files[-1].stem + ".pdf"

# 保存
with open(merged_file, "wb")as f:
    pdf_join.write(f)

画像ファイルをPDFファイルに結合

pip install img2pdf

「image_files」というフォルダの中に結合させたい画像ファイルを入れておく

import os
import img2pdf
from traceback import print_exc


def convert_dir(dir_path):
    if os.path.isdir(dir_path):
        pdf_file_path = "{}.pdf".format(os.path.basename(dir_path))
        pdf_file_path = os.path.join(os.path.dirname(dir_path), pdf_file_path)
    else:
        raise Exception("invalid path")

    images_ = []
    print("scanning directory: {}".format(dir_path))
    for item in os.listdir(dir_path):
        path_ = os.path.join(dir_path, item)
        if os.path.isfile(path_):
            ext_ = os.path.splitext(path_)[-1].lower()
            if ext_ in [".jpg", ".jpeg", ".png"]:
                images_.append(path_)
            else:
                continue
        else:
            continue

    if len(images_) == 0:
        raise Exception("no images files")
    else:
        images_.sort()

    print("generating pdf file:{} ...".format(pdf_file_path))
    with open(pdf_file_path, 'wb')as f:
        f.write(img2pdf.convert(images_))


if __name__ == "__main__":
    try:
        dir_path = "./image_files"
        convert_dir(dir_path)
    except BaseException:
        print_exc()
画像データのサイズなどそのまま出力させていますが、明示的に指定することもできます。ただし、様々なファイルサイズによってエラーが多発したため、明示的に指定していません
例外処理
try:
  # 例外が発生しそうな処理
except:
  # 例外が起きたとき
finally:
  # 例外の有無に関わらず必ず実行する処理