【Python + PDF】Google DriveのPDFを結合+α

# 試験期間
ワイ 「試験勉強やだ〜」
ワイ 「〇〇1回.pdf, 〇〇2回.pdf ...を開いて・・・」
ワイ 「あほかいな！　全部で15個PDFを開かなあかんがな！」

姉 「PDF結合したら良くない？」
姉 「調べてみたけど、すぐにできそうだよ」

ワイ 「で、でも、何かウイルス混入したら嫌なんや」
ワイ 「結合以外にも例えばBookMarkつけたいし・・・」

姉 「Adobe Acrobatなら...」
ワイ 「お金かかりそうだから却下や！却下！」
ワイ 「・・・」
姉 「・・・」


ーーカタカタカタ・・・タン！(Enterを強く押す音)
ワイ 「なるほど、Pythonだと簡単にPDF結合できるんやな！」

# 閑話休題
こんにちは、Bana7です。
今回はGoogle Driveに保存されているPDFを結合してくれるコードを書いてみました。

一緒に勉強会資料や授業資料のPDFを結合してみましょう！

[GitHubリポジトリ](https://github.com/Aruminium/pdfConsolidation)

![スクリーンショット 2022-07-30 21.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/7cbd59dd-5f15-36c6-b8c5-1461264cd9e8.png)

## なぜGoogle Driveなのか
私がGoogle Driveにこだわるのは、共有がしやすい。ただそれだけです。スマホからでも、PCからでもアクセスできるのはやはり良いです。

加えて、今回は誰でも簡単に実行できるように,Google Colabの環境を用いるためでもあります。

## 環境・ライブラリ
主なライブラリ：PyPDF2
環境： Google Colab

# 実際に結合してみよう！
[こちら](https://colab.research.google.com/github/Aruminium/pdfConsolidation/blob/main/pdfConsolidation.ipynb)をクリックするとGoogle Colabが開かれます。

また今回は/pdf/test/に以下の3つのPDFを配置しました。これらのPDFを結合します。

![スクリーンショット 2022-07-31 0.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/ec0a3b4a-5ccc-65cd-9801-2fba8982dc52.png)

## インストール & import
実装にあたり不必要なライブラリもimportされていますが、気にしないでください

![スクリーンショット 2022-07-31 0.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/6acf765b-fa01-69c8-815e-d08bcc8b50de.png)

## PDFファイル取得

基本的に画面右側のUIに入力するだけで実行できるようになっています。
dirPathにpdf/test/と入力すると、結果が得られていることが確認できます。

![スクリーンショット 2022-07-31 0.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/2de2c782-2e70-3703-8d77-b0917406f621.png)

## ファイル名変更
結合するファイルが全てフォーマットされているとは限りません。
そこで以下の関数を用いて任意の形にフォーマットを行います。
処理としてはreplaceとos.renameを用いているだけです。

```python
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に"_", "ああ"と入力し実行するときちんとフォーマットされたファイル名になりました！

![スクリーンショット 2022-07-31 0.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/3814778b-b0c3-c583-d2c4-91d77d99f91e.png)

Google Driveの方もしっかりrenameされているのが確認できます！
![スクリーンショット 2022-07-31 1.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/2cffa49b-3c0a-0a6e-199b-debc217b5539.png)

## 並び替え
今回は1,2,3と並んでいますが、連番のPDFファイルを結合するときに、読み込んだPDFファイルが昇順で並んでいないことがあります。

そこでnatsort (UI上では"ascending"に対応)をしてあげます。

他にも並び替えできるようにしていますが、おそらく使うことはないのでYAGNI原則に反則していますが、念の為に実装しました。
![スクリーンショット 2022-07-31 1.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/a20251a8-b46d-6cb0-d38c-7a88abc227ac.png)


もし、これで連番に並び替えされていない場合は再びフォーマットしてから、実行してみてください

## ページ数取得
後ほど、BookMark(しおり)を追加するためにページ数を取得します。
![スクリーンショット 2022-07-31 1.11.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/d659f80c-028e-b3a0-934c-65b8b43dbfef.png)


少し分かりづらいですが、このライブラリではPDFは０indexなので、機能拡張する際は注意が必要です。

## 出力

(もっと良い変数の命名規則があったと思いますが)
pdfName,exportPathにそれぞれ入力し実行するとPDFが結合されます。

![スクリーンショット 2022-07-31 1.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/3d16dac9-94ea-0c2a-fc57-f0c39e2cac5e.png)

実際に生成されているのが確認できました。

![スクリーンショット 2022-07-31 1.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/11de0103-ff02-d662-9a3d-2ffd46ec4950.png)

## BookMark追加
ここからが本題です。PDFを結合してくれるサービスはありますが、BookMarkもつけてくれるサービスはなかなか無いと思います。加えて、PDFを圧縮してくれるようにしました。

しかし、PDF圧縮に関しては1MB程度の圧縮しか見られなかったので、要アップデートです。

![スクリーンショット 2022-07-31 1.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/795deb5e-75e4-b53c-f8e8-d0ffd6fd1045.png)

## 完成したPDFを確認
無事にPDF結合ができました！これで勉強がしやすくなりました！

![スクリーンショット 2022-07-31 1.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/3e6c6458-7c60-b535-2646-84016470ad7e.png)

# 最後に
今回はGoogle DriveのPDFを結合するといった、ちょっとしたツール作成を行いました。
よかったら試してみていただけると幸いです。
定期的に改良を行っていくので、よろしくお願いします！

## リポジトリ
https://github.com/Aruminium/pdfConsolidation