PDFファイルを回転して保存、分割・結合が一発!PythonでPyPDF2 [コピペサンプルコード付き]

pdfファイルの編集はネットのオンラインツールは危険。PyPDF2で無料で自炊しよう。すぐ実装できる!初心者向け

ビジネスの書類はPDFファイルが一般的です。しかし、PDFファイルの回転・分割・結合などを無料で行うには工夫が必要です。

PDFファイルを回転・分割・結合してくれるオンラインツールなどもありますが、ファイルをアップロードすることになるので、機密文書・取引文書をどこかのよく分からないサーバに置くことになりセキュリティ的に危険と言えるでしょう。

どうでも良いドキュメントの場合はオンラインツールで編集して問題ないと思いますが、重要ファイルの場合はやはり自前で編集したいところです。

 

本記事では人気のプログラム言語「Python」とそのライブラリ「PyPDF2」を使って、PDFファイルを回転・分割・結合して保存する方法についてまとめました。

プログラマー以外の方でも手軽にプログラミングを始める時代です。Pythonは使いやすいと思いますが、やはりビギナーの場合は実際に動く具体的なサンプルが欲しいところです。このような初心者さんの要望を鑑みて「Pythonサンプルコード」シリーズとして記事を公開しています。

なお、実行環境はローカルPCのWindows環境で実行しています(Pythonなどインストール済)。

環境

  • Windows 10 Pro
  • Python 3.6.4
  • (ライブラリ) PyPDF2 1.26.0

 

PythonでPDFファイルの回転・分割・結合のソースコードの全容。

まず最初にソースコード全体を記載します。詳細な解説は後述します。

最初のパラメータ部分でファイル名・分割・結合ファイルを格納するフォルダ名を指定しています(フルパスで指定することも可能。ファイル名だけの場合はプログラム配置場所と同じ場所となります)。

※事前に「pip install PyPDF2」にて、PyPDF2のライブラリをインストールしておきましょう

※PyPDF2は他にも色々と出来ることがありますが初心者向け記事のため省きます。

Pythonソースコード ※ダブルクリックでコピペできます

 

なお、今回はプログラムのテスト用に、以下のような簡単なPDFファイル(2ページのみ)を用意しました。こちらのサンプルで解説いたします。

 

PDFファイルを回転した上で保存する(右回り90度、左回り90度、上下回転)。

処理本体の関数(pdf_roll)
file = PyPDF2.PdfFileReader(open(p_file + ‘.pdf’, ‘rb’))
file_output = PyPDF2.PdfFileWriter()
for page_num in range(file.numPages):
.  page = file.getPage(page_num)
.  page.rotateClockwise(p_angle)
.  file_output.addPage(page)
with open(p_file + ‘_roll.pdf’, ‘wb’) as f:
.  file_output.write(f)
関数の実行
pdf_roll(FILE_PDF, 90)

まず、基本的なPyPDF2の使い方ですが、ファイルの読み込みは「PyPDF2.PdfFileReader」、ファイルの書き込みは「PyPDF2.PdfFileWriter」を使用します。PDFはテキストで扱うことができませんので、open関数では「rb」「wb」などバイナリ指定を忘れないように注意します。

PDFファイルを回転する処理は以下の流れです

  1. PDFを読み込む
  2. 読み込んだPDFをページごとに処理する
  3. rotateClockwiseでページを回転する
  4. 回転したページをPDFに書きだす

PDFの回転自体は「page.rotateClockwise(p_angle)」の1行で実施可能です(特定のページのみ回転させるなどコントロールすることも可能)。p_angleは回転する角度で以下を指定すればOKです。

  1. 右回り90度:「90」
  2. 上下回転:「180」
  3. 左回り90度:「270」

例えば、先ほどのサンプルPDFに右回り90度に回転する処理を実行すると、以下のようになります。

※本サンプルプログラムでは「FILE_PDF」はプログラムの最初にパラメータ部分で記載しています。

 

PDFファイルをページごとに分割して保存する

処理本体の関数(pdf_split)
file = PyPDF2.PdfFileReader(open(p_file + ‘.pdf’, ‘rb’))
for page_num in range(file.numPages):
.  page = file.getPage(page_num)
.  file_output = PyPDF2.PdfFileWriter()
.  file_output.addPage(page)
.  with open(p_folder + ‘\\’ + p_file + ‘_split_’ + str(page_num) + ‘.pdf’, ‘wb’) as f:
.    file_output.write(f)
関数の実行
pdf_split(FILE_PDF, FILE_PDF_FOLDER)

PDFの分割処理は回転処理とほぼ同じ要領で可能です。むしろ分解するだけなので簡単と言えるでしょう。

  1. PDFを読み込む
  2. 読み込んだPDFをページごとに処理する
  3. ページごとにPDFに書きだす

PDFのファイルごとの分割はファイルが複数になりますので、サンプルコードでは、フォルダ(FILE_PDF_FOLDER)を指定した上で、ファイル名に連番を付与して出力するようにしています。

先ほどのサンプルPDF(2ページ)が1ページづつに分割されて、フォルダに出力されます。

「PdfReadWarning: Superfluous whitespace found in object header」というエラーが出ることがあるようです。無視してもPDFの出力には影響ないようですが詳細不明です。

スキャンしたPDFなどで発生するようです。

 

フォルダ内のPDFファイルを結合して、1つのPDFファイルに統合・マージして保存する。

処理本体の関数(pdf_merge)
file_list = glob.glob(os.path.join(p_folder, ‘*.pdf’))
file_output = PyPDF2.PdfFileMerger()
for file in file_list:
.  file_output.append(file)
file_output.write(p_file + ‘_merge.pdf’)
file_output.close()
関数の実行
pdf_merge(FILE_PDF, FILE_PDF_FOLDER)

分割の逆に結合・マージすることも可能です。

先ほどと同様にファイルを1つづつ読み込んで、ページごとにappendしていっても良いのですが、結合時は「PyPDF2.PdfFileMerger」という便利な関数があるので、こちらを利用します。

サンプルコードではフォルダ内の全てのPDFファイルを取得するためにglobを使用しています。glob、OSのimportが必要なので、プログラムの最初に記述するのを忘れないようにしてください。

また、PDFを結合する順番を変更する場合は、sortなどで入れ替える必要があります。PdfFileMergerにappendする前に処理を加えておきましょう。

PdfFileMergerの使い方は簡単で、forループで各PDFファイルをappendし、最後にwriteとするだけでマージしたPDFが出力されます。