ここでは業務効率化・自動化の事例として、PythonでPDFを分割する方法を解説します。
使用ライブラリ
PythonでPDFファイルを操作するライブラリはPyMuPDF
,PyPDF2
,PDFminer
などがあります。
それぞれのライブラリで得意とする操作が異なるため使い分けていきます。
ライブラリ使い分けをまとめると以下のようになります。
今回はPyPDF2
を使用します。
インストール:必要
ライブラリを利用するには、pip
コマンドでPyPDF2
ライブラリをインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)
Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます。)
PDFファイルをページ毎に分割する
PDFファイルをページ毎に分割する方法を解説します。
以下のようなディレクトリ構成を例にします。
Pythonスクリプトファイルと同じディレクトリに、分割するPDFファイルが保存されているものとします。
このPDFファイルを1ページ毎に分割し、フォルダを作成して保存します。
プログラムは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 1: ライブラリ設定 import PyPDF2 import os # 2: PDFの保存先フォルダを設定 path = os.getcwd() filename = '経費精算書.pdf' dir_name = filename.split('.')[0] pdf_dir = os.path.join(path, dir_name) if os.path.isdir(pdf_dir) == False: os.mkdir(pdf_dir) # 3: PDFを読み込みオブジェクトを生成 reader = PyPDF2.PdfFileReader(filename) # 4: PDFのページ数を取得 page_num = reader.getNumPages() # 5: PDFを分割 for page in range(page_num): writer = PyPDF2.PdfFileWriter() p = reader.getPage(page) writer.addPage(p) # 6: 分割したPDFに名前を付けて保存 fnum = '{0:03d}'.format(page+1) newpdf = os.path.join(pdf_dir, f'{filename}_{fnum}.pdf') with open(newpdf, mode='wb') as f: writer.write(f) |
分割後のファイルは以下のようになります。
プログラムを解説します。
1:ライブラリ設定
1 2 3 | # 1: ライブラリ設定 import PyPDF2 import os |
PyPDF2ライブラリを使用するためにインポートします。
またパスを取得・生成するためにosモジュールを呼び出します。
2:PDFの保存先フォルダを設定
1 2 3 4 5 6 7 | # 2: PDFの保存先フォルダを設定 path = os.getcwd() filename = '経費精算書.pdf' dir_name = filename.split('.')[0] pdf_dir = os.path.join(path, dir_name) if os.path.isdir(pdf_dir) == False: os.mkdir(pdf_dir) |
ポイントを解説します。
Pythonスクリプトを実行しているディレクトリをos.getcwd()
で取得してpath
に格納します。getcwd()
については以下の記事を参考にしてください。
・参考記事:Pythonでカレントディレクトリを取得・変更
読み込むPDFを設定します。
PDFのファイル名「経費精算書.pdf」から拡張子抜きの文字列「経費精算書」を取得し、dir_name
に格納します。filename.split('.')
で [‘経費精算書’, ‘pdf’] のリストを取得し[0]
で1番目の要素を取り出しています。
・関連記事:文字列処理-文字列の分割(split)
分割したPDFの保存先パスを設定します。path
とdir_name
を結合してpdf_dir
に格納しています。
os.mkdir(pdf_dir)
os.path.isdir()
で、先程設定したPDF保存先フォルダの有無を調べ、存在しない場合はos.mkdir()
でフォルダを作成します。
3:PDFを読み込みオブジェクトを生成
1 2 | # 3: PDFを読み込みオブジェクトを生成 reader = PyPDF2.PdfFileReader(filename) |
PyPDF2のPdfFileReader
クラスでPDFファイルを読み込みreader
に格納します。
4:ページ数を取得
1 2 | # 4: PDFのページ数を取得 page_num = reader.getNumPages() |
読み込んだPDFオブジェクトからgetNumPage()
メソッドでページ数を取得します。
5:PDFを分割
1 2 3 4 5 | # 5: PDFを分割 for page in range(page_num): writer = PyPDF2.PdfFileWriter() p = reader.getPage(page) writer.addPage(p) |
1行ずつ解説します。
1ページずつ処理を行うためページ数の範囲で繰り返し処理を行います。
・関連記事:繰り返し処理(for文)
PdfFileWriter
クラスで空のwriter
オブジェクトを生成します。
PDFオブジェクトから1ページずつ取り出します。
取り出したページをaddPage()
メソッドでwriter
オブジェクトに追加します。
6:分割したPDFに名前を付けて保存
1 2 3 4 5 | # 6: 分割したPDFに名前を付けて保存 fnum = '{0:03d}'.format(page+1) newpdf = os.path.join(pdf_dir, f'{filename}_{fnum}.pdf') with open(newpdf, mode='wb') as f: writer.write(f) |
分割したファイル名に連番を付けるために、3桁のゼロ埋め連番001、002… を生成します。
ファイル保存先パスを設定します。
pdf保存先フォルダパスと元のファイル名、および連番を結合しています。「経費精算書.pdf_001.pdf」のようなファイル名になります。
ファイル名の指定で f文字列を利用しています。使用方法は以下の記事を参照してください。
・関連記事:文字列処理ーf文字列
ファイルを書き込むために、新しいファイルを wb(write binary) モードで開き、f
と設定します。
writer
オブジェクトをファイル f
に書き込みます。
PythonでPDFファイルを分割する方法を解説しました。
PDFファイルの操作に関しては、以下の記事も参考にしてみてください。
・関連記事:PythonでPDFファイルを結合する(PyPDF2)
・関連記事:PythonでPDFのページサイズを取得(PyPDF2)
・関連記事:PyMuPDFの基本的な使い方
・関連記事:PythonでPDFのテキストを抽出する(PyMuPDF)
・関連記事:PythonでPDFファイルの画像を抽出する(PyMuPDF)