片面スキャナーで両面資料をスキャンし、Pythonで結合する(PyPDF2)

テーマはPyPDF2を使ったPDFの結合 pythonの話

PDFを単純に結合するだけでなく、
・片面スキャナーで両面資料をスキャンしたような2つを1ページごとに結合する
・ページが逆順に並んでいるPDFを順番を後ろから結合する
といったことがPyPDF2を使えば簡単にできました。

片面スキャナーだと裏面が逆順に

ADF機能付きのスキャナ複合機

我が家のプリンターは複合機で、ADF機能(原稿を自動送りする機能)付きですが、片面づつしかスキャンできません。

表面をスキャンして、そのまま裏返して裏面をスキャンすると裏面はページが逆順になってスキャンされます。

この片面づつ原稿をスキャンしたPDFをPythonで結合しました。

PyPDF2をpipでインストールする

事前準備として、「PyPDF2」というライブラリをインストールしておきます。

pip install PyPDF2

でインストール可能です。

PyPDF2の詳しい内容は、https://pypdf2.readthedocs.io/en/3.0.0/に記載されています。

PyPDF2を使って単純に結合する

手始めに、PyPDF2を使って2つのPDFを結合してみます。

PyPDF2.PdfFileMerger()を使う

まずは、2つのPDFを全ページをそのまま結合してみます。

下記でそれぞれのPDFのすべてのページが結合されます。

ファイルは2つだけでなく、いくつでも増やせます。

import PyPDF2
#単純に統合する。

# PDFの空枠を作る
merger = PyPDF2.PdfFileMerger()

# つくった空枠に.appendで、それぞれのPDFを追加する
merger.append('pdf_1.pdf')
merger.append('pdf_2.pdf')

# .writeでPDFファイルとして書き出し保存する
merger.write('merger.pdf')
merger.close()

この方法は、単純に2つのPDFを結合しています。

裏面が逆順でスキャンされているものを結合する

片面の自動送りのスキャナーで片面づつスキャンするときに、表面をスキャンして、原稿を並び替えずに裏返してスキャンをします。
そうすると、裏面は逆順にスキャンされていきます。

そのため、10ページの資料だと、
表面: 1, 3, 5, 7, 9
裏面: 10, 8, 6 ,4 , 2
という並びでスキャンされます。

これを結合するには、
・表面と裏面を1ページづつ交互に結合していく。
・裏面は順番が逆なので後ろから結合していく。
という2つを考慮することになります。

特定のページを指定して結合する

特定のページだけを抜き出して結合していく場合は、appendのオプションで 「pages=(開始ページ, 終了ページ)を追加します。

開始ページ、終了ページの指定は、pythonのrange(x, y)の考え方と同じです。
最初のページは0です。
開始ページはそのページを含み、終了ページはそのページを含みません。

2ページ目から4ページ目までの場合は、「pages=(1, 4)」のように指定します。

「pages=(2,3)」と指定すると3ページ目だけが結合の対象になります。

import PyPDF2

# PDFの空枠を作る
merger = PyPDF2.PdfFileMerger()

#特定のページを結合する 
merger.append('pdf_1.pdf', pages=(1, 4)) #2ページ目から4ページ目まで
merger.append('pdf_2.pdf', pages=(2, 3)) #3ページ目だけを結合する
    
merger.write('merger.pdf')
merger.close()

表面ファイルと裏面ファイルを交互に結合する

1ページを抜き出して結合することができるようになったので、最終目標の片面づつスキャンした表面ファイルと裏面ファイルを交互に結合していきます。

裏面ファイルは逆順に結合していきます。

最初に、PyPDF2の「PdfReader」でPDFファイルを読み込んでページ数を把握して、for構文で2つのファイルを1ページづつ結合していきます。

import PyPDF2
#表面はページ順、裏面は逆順で1ページづつ結合する。
omote = 'omote.pdf'
uramen = 'uramen.pdf'

# ページ数を調べる。
# PDFを読み込む
reader = PyPDF2.PdfReader(omote)
# ページ数を取得する
page = len(reader.pages)

# PDFの空枠を作る
merger = PyPDF2.PdfFileMerger()

# 表面は1ページ目から、裏面は最終頁から順に交互に結合していく
for i in range(page):
    merger.append(omote, pages=(i, i+1))
    merger.append(uramen , pages=(page-i-1, page-i))
    
merger.write('merger.pdf')
merger.close()

これで、2つのファイルをページ順に結合することができました。

コメント

タイトルとURLをコピーしました