PythonでPDFファイルを結合/分割【PyPDF2のサンプルコード コピペ自由】

2024年3月15日

Photo by Rubaitul Azad on Unsplash

誰かから送られてきたPDFファイルの一部を、違う誰かに送りたいということはありませんか?

例えば、何十ページもある建設図面の一部だけを誰かに共有したいとか、社内資料から機密情報だけを削除して誰かに共有したいとかよくあることだと思います。

 

また逆に、いくつかのPDFファイルをまとめて1つのPDFファイルにしたいということもよくあると思います。

 

そんな時に、わざわざ印刷してから必要な分だけをスキャンしてPDFファイルにするのは面倒ですし、プリンタやスキャナがない外出先ではそもそもできません。

管理人にはそのようなニーズがよくあったのですが、Pythonを使えばできることを知り自分でコーディングしました。

今ではかなりの頻度で使っています。

各行にコメントを入れたコーディングユーザー定義関数を使ったコーディングの2通りで公開しますので、是非コピペして使ってみて下さい。

 

当ページのリンクには広告やプロモーションが含まれています。

こんなことが可能

複数のPDFファイルを1つのPDFファイルに結合

5つのPDFファイルを1つのPDFファイルに結合します。

 

入力ファイル

1_China.pdf

2_Hongkong.pdf

3_Myanmar.pdf

4_Thailand.pdf

5_Cambodia.pdf

 

出力ファイル

5_countires.pdf

 

複数ページあるPDFファイルを各ページに分解し必要なページだけを指定する順番で結合

5ページあるPDFファイルをページ単位で一旦分解して、5ページ目⇨1ページ目⇨3ページ目の順番に結合して1つのPDFファイルにします。

 

入力ファイル

5_countries.pdf

 

出力ファイル

3_countries.pdf

 

Pythonコード

複数のPDFファイルを1つのPDFファイルに結合

Pythonのプログラムファイルがあるカレントフォルダの下に’Original’という名のフォルダを作り、その中に結合前のPDFファイルを置いて下さい。

カレントフォルダに’5_countries.pdf’というファイル名で結合後のPDFファイルができます。

 

コメント付きコーディング

import PyPDF2
import glob
import os

# 'Original'フォルダにあるpdfファイル名すべてをリストとして取得
files = glob.glob(os.path.join('Original', '*.pdf'))

# 取得したpdfファイル名のリストをソート
files.sort()

# 結合結果を入れる結合オブジェクトを生成
merger = PyPDF2.PdfMerger()

# pdfファイル名リストに入っているファイル名につき繰り返し処理
for file in files:
# 各ファイルの中身を結合オブジェクトに結合
    merger.append(file)
# 結合結果を書き込むべく'5_countries.pdf'を開く
merge_file = open('5_countries.pdf', 'wb')
# 結合結果を開いているファイルに書き込む
merger.write(merge_file)
# 開いているファイルを閉じる
merge_file.close()

 

ユーザー定義関数でコーディング

import PyPDF2
import glob
import os

def combine_pdf(in_dir, out_file):
    files = glob.glob(os.path.join(in_dir, '*.pdf'))
    files.sort()

    merger = PyPDF2.PdfMerger()
    for file in files:
        merger.append(file)

    merger.write(out_file)
    merger.close()

combine_pdf('Original', '5_countries.pdf')

 

複数ページあるPDFファイルを各ページに分解し必要なページだけを指定する順番で結合

Pythonのプログラムファイルがあるカレントフォルダの下に’Separated’という名のフォルダを作って下さい。

その中に中間ファイル(各ページに分解したPDFファイル)が保存されます。

カレントフォルダに置かれたPDFファイル’5_countries.pdf’から1/3/5ページ目だけを抜き出して、5/1/3ページの順番に並べ替えた’3_countries.pdf’が同じフォルダに生成されます。

 

コメント付きコーディング

import PyPDF2

# ***** まずは各ページに分解 *****
# 元データファイルである'5_countries.pdf'を開く
original_file = open('5_countries.pdf', 'rb')

# '5_countries.pdf'を読み込む
reader = PyPDF2.PdfReader(original_file)

# 読み込んだファイルのすべてのページにつき繰り返し処理
for i in range(len(reader.pages)):
# ?ページ目を書き込むべく'Separated'フォルダのp?.pdfを開く
    each_page = open(fr'Separated\p{i+1}.pdf', 'wb')
# 書き込みオブジェクトを生成
    writer = PyPDF2.PdfWriter()
# オブジェクトにi+1ページ目を追加
    writer.add_page(reader.pages[i])
# オブジェクトの中身を開いているファイルp?.pdfに書き込む
    writer.write(each_page)
# 開いていたファイルp?.pdfを閉じる
    each_page.close()
# 元データファイルを閉じる
original_file.close()

# ***** 分解した各ページを必要なページだけ結合し直す *****
# 結合オブジェクトを生成
merger = PyPDF2.PdfMerger()

# 結合ファイルに書き出すページを指定
pages = [5, 1, 3]

# 結合ファイルに書き出すファイル名を入れる空リスト(結合ファイル名リスト)を作成
files = []
# 書き出すページにつき繰り返し処理
for i in pages:
# 書き出したいページの中身が入っているファイル名を'file'に入れる
    file = fr'Separated\p{i}.pdf'
# 各ファイル名を結合ファイル名リストにアペンド
    files.append(file)
# 結合ファイル名リストに入っているファイル名につき繰り返し処理
for i in files:
# 各ファイルの中身を結合オブジェクトに結合
    merger.append(i)

# 結合結果を書き込むべく'3_counties.pdf'を開く
merge_file = open('3_countries.pdf', 'wb')
# 結合結果を開いているファイルに書き込む
merger.write(merge_file)
# 開いているファイルを閉じる
merge_file.close()

 

ユーザー定義関数でコーディング

import PyPDF2

def separate_pdf(raw_file):
    original_file = open(raw_file, 'rb')
    reader = PyPDF2.PdfReader(original_file)

    for i in range(len(reader.pages)):
        each_page = open(fr'Separated\p{i+1}.pdf', 'wb')
        writer = PyPDF2.PdfWriter()
        writer.add_page(reader.pages[i])
        writer.write(each_page)
        each_page.close()

    original_file.close()

def page_allocate_pdf(result_file):
    merger = PyPDF2.PdfMerger()
    files = []
    for i in pages:
        file = fr'Separated\p{i}.pdf'
        files.append(file)

    for i in files:
        merger.append(i)

    merge_file = open(result_file, 'wb')
    merger.write(merge_file)
    merge_file.close()

separate_pdf('5_countries.pdf')
pages = [5, 1, 3]  
page_allocate_pdf('3_countries.pdf')