
Pythonで簡単!PDF編集を自動化しよう
DL同人を扱う際、PDF編集は避けられない面倒な作業のひとつです。通常は専用ソフトを利用することが多いですが、定番の編集作業であればPythonを使った自動化が非常に効率的です。本記事では、初心者でも簡単に取り組めるPythonスクリプトを使って、DL同人制作で頻出するファイル名の規則的なリネーム、単ページPDFの結合処理、PDFファイルの単ページ分割処理を自動化する方法を解説します。
前提条件
本記事では、Pythonの実行環境がすでに用意されていることを前提としています。実行環境がまだ整っていない場合は、以下の記事を参考にセットアップを行ってください。
ライブラリのインストール(PyPDF2)
今回使用するライブラリとして、PDF操作で定評のあるPyPDF2をインストールします。以下のコマンドを実行してください。
python -m pip install PyPDF2
PyPDF2とは?
PyPDF2は、PythonでPDFファイルを操作するための人気の高いライブラリです。このライブラリを使用すると、次のような操作が可能です。
PDFの読み取り
PDFファイルのページ数やテキストを取得できます。
ページやメタデータなどの情報を取得するための便利なインターフェースを提供します。
PDFの作成と編集
新しいPDFを作成し、既存のPDFファイルにページを追加できます。
特定のページを削除したり、ページの順序を変更することも可能です。
PDFの分割と結合
複数のPDFを結合したり、1つのPDFを複数のファイルに分割できます。
暗号化と復号化
PDFファイルにパスワードを設定して暗号化できます。
パスワード保護されたPDFを開くこともサポートしています(パスワードがわかっている場合)。
ユーティリティ
PDFファイルの回転、トリミング、ページサイズの変更など、さまざまな操作が可能です。
PDFファイル名のリネーム
DL同人の製本作業では、PDFファイルの名前を整列させる必要がある場合があります。このような場面では、手作業でリネームするよりもスクリプトを使った自動化が便利です。ここでは以下の2つのリネーム方法を紹介します。
ファイル番号をひとつずつ増加させる
欠番を詰める
1. ファイル番号をひとつずつ増加させる
"single"ディレクトリ内にあるPDFファイルの番号を1ずつ増加させ、新しい名前のファイルを"mod"ディレクトリに保存します。例えば、元のファイル名が以下のようになっているとします。
003.pdf
004.pdf
005.pdf
このスクリプトを実行すると、番号が1ずつ増加して以下のようにリネームされます。
004.pdf
005.pdf
006.pdf
以下はそのためのスクリプトです。
import os
# "single"ディレクトリと"mod"ディレクトリのパスを指定
single_directory = os.path.join(os.getcwd(), "single")
mod_directory = os.path.join(os.getcwd(), "mod")
# "mod"ディレクトリが存在しない場合は作成
if not os.path.exists(mod_directory):
os.makedirs(mod_directory)
# "single"ディレクトリ内のファイルを取得し、".pdf"で終わるファイルのみを抽出
pdf_files = [f for f in os.listdir(single_directory) if f.endswith('.pdf')]
# ファイル名を番号順にソート
pdf_files.sort()
# リネーム処理
for old_name in pdf_files:
# 元ファイル名から番号を抽出
old_number = int(old_name.split('.')[0])
# 新しい番号を計算(1だけ大きい番号にリネーム)
new_number = old_number + 1
new_name = f"{new_number:03}.pdf"
# 元ファイルのパスと新しいファイルのパスを生成
old_path = os.path.join(single_directory, old_name)
new_path = os.path.join(mod_directory, new_name)
# ファイルをコピーしてリネーム
os.rename(old_path, new_path)
print(f"'single'ディレクトリ内のPDFファイルをリネームし、'mod'ディレクトリに保存しました。")
解説
single_directory: リネーム対象のPDFファイルが入ったフォルダのパスです。必要に応じてフォルダの場所を指定してください。このフォルダに単ページPDFファイルを配置しておく必要があります。
mod_directory: リネーム後のPDFファイルを保存するフォルダのパスです。このフォルダが存在しない場合は自動で作成されます。
番号を増加させる処理(new_number = old_number + 1): この行で番号を1つ増加させています。必要に応じて増加量を変更可能です。
f"{number:03}": 3桁のゼロ埋め形式でファイル番号を整えます。このフォーマットを変更すれば、ゼロ埋めなしや異なる桁数の形式にも対応可能です。
2. 欠番を詰める
"single"ディレクトリ内にあるPDFファイルの番号に欠番がある場合、それを詰めて連続した番号にリネームします。
例えば、元のファイル名が以下のようになっているとします:
002.pdf
004.pdf
005.pdf
このスクリプトを実行すると、欠番が詰められて以下のようになります:
001.pdf
002.pdf
003.pdf
以下はそのためのコードです:
import os
# "single"ディレクトリと"mod"ディレクトリのパスを指定
single_directory = os.path.join(os.getcwd(), "single")
mod_directory = os.path.join(os.getcwd(), "mod")
# "mod"ディレクトリが存在しない場合は作成
if not os.path.exists(mod_directory):
os.makedirs(mod_directory)
# "single"ディレクトリ内のファイルを取得し、".pdf"で終わるファイルのみを抽出
pdf_files = [f for f in os.listdir(single_directory) if f.endswith('.pdf')]
# ファイル名を番号順にソート
pdf_files.sort()
# リネーム処理
for i, old_name in enumerate(pdf_files):
# 新しい番号を計算
new_number = i + 1 # リネーム後の番号(欠番を詰める)
new_name = f"{new_number:03}.pdf"
# 元ファイルのパスと新しいファイルのパスを生成
old_path = os.path.join(single_directory, old_name)
new_path = os.path.join(mod_directory, new_name)
# ファイルをコピーしてリネーム
os.rename(old_path, new_path)
print(f"'single'ディレクトリ内のPDFファイルをリネームし、'mod'ディレクトリに保存しました。")
解説
single_directory: リネーム対象のPDFファイルが入ったフォルダのパスです。必要に応じてフォルダの場所を指定してください。このフォルダに単ページPDFファイルを配置しておく必要があります。
mod_directory: リネーム後のPDFファイルを保存するフォルダのパスです。このフォルダが存在しない場合は自動で作成されます。
欠番を詰める処理(new_number = i + 1): 欠番を詰める場合、番号は順に振り直されます。開始番号を変更したい場合は、i + 1を適宜変更してください。
f"{number:03}": 3桁のゼロ埋め形式でファイル番号を整えます。このフォーマットを変更すれば、ゼロ埋めなしや異なる桁数の形式にも対応可能です。(例:5桁のゼロ埋め ⇒ f"{number:05}" )
単ページPDFの結合処理
"single"ディレクトリ内にあるPDFファイル(例:"001.pdf", "002.pdf"…)を番号順に結合し、1つのPDFファイルとして出力する方法を解説します。結合されたPDFは、"manga.pdf"という名前で保存されます。
以下はその処理を行うPythonコードです:
import os
from PyPDF2 import PdfMerger
# "single"ディレクトリのパスを指定
directory = os.path.join(os.getcwd(), "single")
# "single"ディレクトリ内のファイルを取得し、".pdf"で終わるファイルのみを抽出
pdf_files = [f for f in os.listdir(directory) if f.endswith('.pdf')]
# ファイル名を番号順にソート("001.pdf", "002.pdf", ...)
pdf_files.sort()
# PdfMergerを使用してPDFを結合
merger = PdfMerger()
for pdf in pdf_files:
merger.append(os.path.join(directory, pdf))
# 結合したPDFを保存
output_file = "manga.pdf"
merger.write(output_file)
merger.close()
print(f"PDFファイルが結合され、'{output_file}'として保存されました。")
解説
single_directory: リネーム対象のPDFファイルが入ったフォルダのパスです。必要に応じてフォルダの場所を指定してください。このフォルダに単ページPDFファイルを配置しておく必要があります。
mod_directory: リネーム後のPDFファイルを保存するフォルダのパスです。このフォルダが存在しない場合は自動で作成されます。
pdf_files.sort(): sortメソッドを使用することで、名前順(番号順)に並べ替えます。この手順があることで、001.pdf → 002.pdf → 003.pdfの順に結合されます。
merger = PdfMerger(): PdfMergerのappendメソッドを使用して、各PDFファイルを順に結合します。
PDFファイルの単ページ分割処理
"manga.pdf"というPDFファイルを、1ページずつ分割して"single"ディレクトリに保存する方法を解説します。分割されたファイルは、"001.pdf", "002.pdf", ...といった形式で保存されます。
import os
from PyPDF2 import PdfReader, PdfWriter
# "single"ディレクトリのパスを指定
directory = os.path.join(os.getcwd(), "single")
# "single"ディレクトリが存在しない場合は作成
if not os.path.exists(directory):
os.makedirs(directory)
# 分割するPDFファイル
input_file = "manga.pdf"
# PDFリーダーを作成
reader = PdfReader(input_file)
# 各ページを単一のPDFとして保存
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
# 出力ファイル名を生成(例: "001.pdf")
output_file = os.path.join(directory, f"{i+1:03}.pdf")
# ファイルを書き込み
with open(output_file, "wb") as f:
writer.write(f)
print(f"'{input_file}'を分割し、'{directory}'ディレクトリに保存しました。")
解説
single_directory: リネーム対象のPDFファイルが入ったフォルダのパスです。必要に応じてフォルダの場所を指定してください。このフォルダに単ページPDFファイルを配置しておく必要があります。
mod_directory: リネーム後のPDFファイルを保存するフォルダのパスです。このフォルダが存在しない場合は自動で作成されます。
ページごとの保存処理: enumerate(reader.pages)を使って、PDFの各ページを1つずつ取得します。それぞれのページをPdfWriterに追加し、新しいPDFとして保存します。ファイル名はf"{i+1:03}.pdf"の形式で、番号が3桁でゼロ埋めされます(例: 001.pdf)。
まとめ
本記事では、ファイル名の規則的なリネーム方法、単ページPDFの結合処理、PDFファイルの単ページ分割処理について解説しました。これらのスクリプトを実際の作業に合わせて編集し活用することで、DL同人データ作成の作業効率が大幅に向上します。皆さんの同人活動がさらに充実したものになることを願っています!