試験期間
ワイ 「試験勉強やだ〜」
ワイ 「〇〇1回.pdf, 〇〇2回.pdf ...を開いて・・・」
ワイ 「あほかいな! 全部で15個PDFを開かなあかんがな!」
姉 「PDF結合したら良くない?」
姉 「調べてみたけど、すぐにできそうだよ」
ワイ 「で、でも、何かウイルス混入したら嫌なんや」
ワイ 「結合以外にも例えばBookMarkつけたいし・・・」
姉 「Adobe Acrobatなら...」
ワイ 「お金かかりそうだから却下や!却下!」
ワイ 「・・・」
姉 「・・・」
ーーカタカタカタ・・・タン!(Enterを強く押す音)
ワイ 「なるほど、Pythonだと簡単にPDF結合できるんやな!」
閑話休題
こんにちは、Bana7です。
今回はGoogle Driveに保存されているPDFを結合してくれるコードを書いてみました。
一緒に勉強会資料や授業資料のPDFを結合してみましょう!
なぜGoogle Driveなのか
私がGoogle Driveにこだわるのは、共有がしやすい。ただそれだけです。スマホからでも、PCからでもアクセスできるのはやはり良いです。
加えて、今回は誰でも簡単に実行できるように,Google Colabの環境を用いるためでもあります。
環境・ライブラリ
主なライブラリ:PyPDF2
環境: Google Colab
実際に結合してみよう!
こちらをクリックするとGoogle Colabが開かれます。
また今回は/pdf/test/に以下の3つのPDFを配置しました。これらのPDFを結合します。
インストール & import
実装にあたり不必要なライブラリもimportされていますが、気にしないでください
PDFファイル取得
基本的に画面右側のUIに入力するだけで実行できるようになっています。
dirPathにpdf/test/と入力すると、結果が得られていることが確認できます。
ファイル名変更
結合するファイルが全てフォーマットされているとは限りません。
そこで以下の関数を用いて任意の形にフォーマットを行います。
処理としてはreplaceとos.renameを用いているだけです。
def changeFilesName(files: List[str], old: str, new: str) -> List[str]:
"""ファイル名を変更する&driveの方にも適用する - change FIles Name
Args:
files (list[str]): files path list
old (str): Required. String to be replaced.
new (str): Optional. String to replace the old one.
Returns:
list[str]: Processed list
Examples:
When you want to delete the string "hoge" in a list
files = changeFilesName(files, "hoge", "")
"""
newFiles = [pdfName.replace(old, new) for pdfName in files]
[os.rename(pdfFile, newPdfFile) for pdfFile, newPdfFile in zip(files, newFiles)]
return newFiles
oldに"_", "ああ"と入力し実行するときちんとフォーマットされたファイル名になりました!
Google Driveの方もしっかりrenameされているのが確認できます!
並び替え
今回は1,2,3と並んでいますが、連番のPDFファイルを結合するときに、読み込んだPDFファイルが昇順で並んでいないことがあります。
そこでnatsort (UI上では"ascending"に対応)をしてあげます。
他にも並び替えできるようにしていますが、おそらく使うことはないのでYAGNI原則に反則していますが、念の為に実装しました。
もし、これで連番に並び替えされていない場合は再びフォーマットしてから、実行してみてください
ページ数取得
後ほど、BookMark(しおり)を追加するためにページ数を取得します。
少し分かりづらいですが、このライブラリではPDFは0indexなので、機能拡張する際は注意が必要です。
出力
(もっと良い変数の命名規則があったと思いますが)
pdfName,exportPathにそれぞれ入力し実行するとPDFが結合されます。
実際に生成されているのが確認できました。
BookMark追加
ここからが本題です。PDFを結合してくれるサービスはありますが、BookMarkもつけてくれるサービスはなかなか無いと思います。加えて、PDFを圧縮してくれるようにしました。
しかし、PDF圧縮に関しては1MB程度の圧縮しか見られなかったので、要アップデートです。
完成したPDFを確認
無事にPDF結合ができました!これで勉強がしやすくなりました!
最後に
今回はGoogle DriveのPDFを結合するといった、ちょっとしたツール作成を行いました。
よかったら試してみていただけると幸いです。
定期的に改良を行っていくので、よろしくお願いします!
リポジトリ