adbird(広告鳥) 備忘録

複数のPDFファイルを結合して、通しページ番号をつけるpythonスクリプト

ディレクトリ内にある複数のPDFファイル(001.pdf 002.pdf …などの連番のPDF)を結合して、通しページ番号をつけるpythonスクリプト

Chat GPTさんに何度も聞きながら、できた。

何はともあれ、python をインストール。Ubuntu 22.04.3 LTS の場合、端末で

sudo apt install python3

PyPDF4をインストール。

 pip install PyPDF4

結合させたい複数のpdfファイルの入っているディレクトリに、下記の内容の mergepdf.py を保存。

import os
import io
from PyPDF4 import PdfFileMerger, PdfFileReader, PdfFileWriter
from reportlab.pdfgen import canvas

# カレントディレクトリを取得
current_directory = os.getcwd()

# 結合後のPDFファイル名
output_pdf = os.path.join(current_directory, "output.pdf")

# ワイルドカードを使用してPDFファイルをリストアップし、ファイル名のソートを行う
pdf_files = sorted([os.path.join(current_directory, file) for file in os.listdir(current_directory) if file.endswith('.pdf')])

# PdfFileMergerオブジェクトを作成
pdf_merger = PdfFileMerger()

# PDFファイルを結合
for pdf_file in pdf_files:
    with open(pdf_file, 'rb') as file:
        pdf_merger.append(file)

# 結合したPDFを一時的なファイルに保存
temp_merged_pdf = os.path.join(current_directory, "temp_merged_file.pdf")
with open(temp_merged_pdf, 'wb') as file:
    pdf_merger.write(file)

# ページ番号を追加する関数
def add_page_numbers(input_pdf, output_pdf):
    with open(input_pdf, 'rb') as file:
        pdf_reader = PdfFileReader(file)
        pdf_writer = PdfFileWriter()

        # 全ページの数を取得
        num_pages = pdf_reader.numPages

        # ページ番号を追加して新しいPDFを作成
        for page_number in range(num_pages):
            page = pdf_reader.getPage(page_number)

            packet = io.BytesIO()
            can = canvas.Canvas(packet)
            text = str(page_number + 1)
            # フォントを設定
           # can.setFont('Helvetica', 12)  # フォント名とフォントサイズ
            can.setFont('Times-Roman', 12)  # フォント名とフォントサイズ
           # can.drawString(565, 810, text)  #ページ番号が右上(左下からの位置。単位はpt。)
            can.drawString(293, 25, text)  #ページ番号中央下(左下からの位置。単位はpt。)
            can.save()

            packet.seek(0)
            new_page = PdfFileReader(packet)
            page.mergePage(new_page.getPage(0))

            pdf_writer.addPage(page)

        # 新しいPDFを保存
        with open(output_pdf, 'wb') as output_file:
            pdf_writer.write(output_file)

# ページ番号を追加
add_page_numbers(temp_merged_pdf, output_pdf)

# 一時的な結合ファイルを削除
os.remove(temp_merged_pdf)

print("PDFの結合とページ番号の追加が完了しました。")

※「can.drawString(293, 25, text) #ページ番号の位置(左下からの位置。単位はpt。)」の箇所は適宜、変更する。

pdfの入っているディレクトリで右クリック>端末で開く

python3 mergepdf.py

Windowsでは以下かも。

python mergepdf.py