ゼロからの業務効率化ノート

30代未経験から始まったノーコード&Pythonチャレンジ

【手軽にPDFを結合!】Pythonを使ったスマートなファイル結合テクニック


ぬこ将軍です🐈
仕事でありがちな請求書や点検表とかの電子ファイルって、提出する時はバラバラではなくて1つにまとめて提出しないといけない時ってありませんか?

ファイル結合のフリーソフトとかがあればまとめるのはラクですが、ソフトのインストールにわざわざシステム管理者の許可が必要だったり、細かい制約があったりでメンドクサイ。。。


今回は「Pythonで複数のPDFファイルをまとめる方法」について、自分の経験を共有しようと思います!
自身の業務の中で複数のPDFファイルをまとめる機会が多く、「いっそ勉強がてらPythonで効率化してみよう!」と思いプログラムを作成しました。

  • 複数のファイルまとめという、面倒な作業を一刻も早く無くしたい!
  • Pythonの勉強を始めたばかりで、何か役に立ちそうなプログラムを作ってみたい!

そんな方々の参考になりましたら幸いです。



Pythonで複数のPDFファイルをまとめる方法

Pythonで複数のPDFファイルをどうまとめたか?私が実践したことを先に結論として書きます。

  1. 必要なライブラリをインポートする。
  2. まとめたい月のフォルダを指定するコードを書く。
  3. 出力先のフォルダを新規作成するコードを書く。
  4. 指定したフォルダ内のファイルを結合するコードを書く。

以上の4ステップについて、具体的に書いていきます。

必要なPythonライブラリをインポートする

必要なライブラリは以下の3つです。コードと目的をそれぞれ書いておきます。

  • import os ⇒フォルダを新しく作成する。
  • import glob ⇒フォルダ内のpdfファイルのパス一覧を取得する。
  • import pypdf ⇒pdfファイルを結合する。

プログラムを書く時、だいたいは最初に使いたいライブラリをimportします。ちなみに、あらかじめ使いたいライブラリはインストールしておかないとimportできないのでご注意を。「ライブラリ名 インストール」とかで検索するとインストール方法は分かりやすいです。

まとめたい月のフォルダを指定するコードを書く

次に「どこのフォルダにあるファイルを結合したいか?」を決めるコードを書きました。
実際の職場にあるフォルダ名とは異なりますが、フォルダ構成は以下のような感じです。


month

年度の下に各月のフォルダがあるのですが、月指定をするたびにわざわざプログラムを修正するのは面倒です。
なので自分で入力できるようにinput関数を導入して、【month = input("まとめたいデータ月の数字を入力してください。")】とコードを書きました。
上のコードを実行すると以下のように、input()の中に書いた文字列が表示されて入力待機画面となります。

input関数なので、入力した数字が文字列型で変数monthに入ります。

path

もう1つの変数pathは【path = r"C:\~Desktop\Python遊び場\点検結果\2023年度\2023." + month】としました。
pathにはまとめたい月のフォルダパスを入れるようにしてあり、先ほどのmonthと合わせてフォルダパスが完成するようになっています。
例えばmonthが"4"だった場合は、2023.4のフォルダパスに該当します。

monthの前のパスをr""で囲っていますが、これはパスの途中にある"\"(バックスラッシュ)が""で囲っただけではエスケープ文字とみなされてしまうためです。
以下のサイトが参考になると思います。
note.nkmk.me

この記事では1つのフォルダ内のファイルを対象に結合しますが、他複数のフォルダの中にあるファイルもまとめて結合したい場合もあると思います。そんな場合は以下の記事を参考にしてください。

【異なるフォルダのPDFも結合!】Pythonでスマートなファイル結合テクニックその2 - ゼロからの業務効率化ノート

出力先のフォルダを新規作成するコードを書く

変数monthの使い道はまだあります。
【path_out = r"C:\~Desktop\Python遊び場\点検結果\結果まとめ\2023年度" + "\\" + month + "月"】とし、出力先フォルダのための変数path_outを設定しました。
そして【os.makedirs(path_out)】のコードを実行することで、path_outに代入したパスに新しくフォルダを作成しました。


ちなみに出力先の最後のフォルダは"4月"ですが、その途中の"結果まとめ"と"2023年度"という、コード実行前には無かったフォルダも一緒に作成されます。これはos.makedirs()という関数が、深い階層まで一気にフォルダを作ってくれるからです。
以下のサイトが参考になると思います。
note.nkmk.me

指定したフォルダ内のファイルを結合するコードを書く

まとめたい月の指定、出力先のフォルダの準備が整えば後はファイルの結合です。まずは【merger = pypdf.PdfMerger()】で複数のPDFファイルを結合するためのクラスオブジェクトを生成します(これはPDFファイルを結合するときに最初に書く必須コードみたいなものという認識で良いと思います)。

次に結合するファイルを選びます。今回は4月の結果ファイルを対象とします。点検結果の4月フォルダにはPDFファイルが3つあります。

結合ファイル群を入れる変数をfilesとし、【files = sorted(glob.glob(path + "/*.pdf"))】というコードを実行して4月の結果ファイルパスをfilesに代入します。

まず【glob.glob(path + "/*.pdf")】で変数path内にあるpdf拡張子のファイルパスを返しています。そして昇順に並べたかったので組み込み関数sorted()を使ってsorted(glob.glob(path + "/*.pdf"))としています。
この後のfor文処理で1ファイルずつ出力してみるとこんな感じになります。

参考サイト
note.nkmk.me

note.nkmk.me

さらにfor文内で【merger.append(file)】というコードを書き、先ほど出力したパスに該当するPDFファイルを結合しました。
仕上げに【merger.write(path_out + "\\" + month + "月_○○部署.pdf")】というコードを実行することで、指定したパスとファイル名で結合ファイルを作成しました。

あとはこれを提出先に送るだけとなりました。もう面倒な結合作業は不要になったのです!

Pythonを使ったファイル結合テクニックまとめ

結合ファイルの中身。エリア1,2はそれぞれ結果1,2の記述のみで、エリア3はそれプラス補足のページ。

Pythonを使ったスマートなファイル結合テクニックの手順をまとめると以下の通りです。

  1. 必要なライブラリをインポートする。
  2. まとめたい月のフォルダを指定するコードを書く。
  3. 出力先のフォルダを新規作成するコードを書く。
  4. 指定したフォルダ内のファイルを結合するコードを書く。

手順を文章にしてみると長くなってしまうのですが、実際にPythonを動かして試してみると簡単にファイル結合が出来てしまいます。

これを読んだあなたも、Pythonを勉強しながら少しずつ面倒な作業を無くしていきませんか?

複数のフォルダの中にあるファイルもまとめて結合したい場合は以下の記事参照です。

nukoshogun.hatenablog.com