ロゴ ロゴ

PythonでPDFファイルを結合するアプリケーションを作った

はじめに

前回のブログリレーのときに図書館の検索システムについて話した記事の最初の項目で図書館の開館時期をお伝えしましたが、閉館期間が5月10日までになりました。5月11日からもどうなるかはわかりません。大学内の施設を使えるようになるのはもっと後の可能性があります。学内ネットワークに入れるようになれば電子ブックを閲覧することができるのでそちらを設定して書籍を探してみても良いかもしれません。図書館では選書会を実施しているみたいです。環境さえあれば家からでも参加できます。詳しくは図書館のホームページを参照してください。

本題

近々、Pythonで作業する必要が出てきたのでPythonの勉強も兼ねて何かGUIアプリケーションを作りたいと考えていました。今、大学内に入れない状況でできなくなったことの中でプログラムで解決できることを探しました。おそらく授業の課題としてレポートを多く課せられるのではないかと思われます。ファイルの形式はその時々で違いますが”PDF”形式で提出することが多くなるのでは? と考えました。もしかしたら複数のPDFファイルをくっつける必要がある場面に出くわすかもしれない(1回の変換で1つのファイルにまとめられるように編集すべきですが)。大学のPCでなら Adobe Acrobat Pro DC が使えるため結合ができますが、無料でインストールできる Reader の方だと結合まではできません。そこでPythonのライブラリを使えばPDFファイルの結合なら簡単にできることが分かったので作ってみました。

開発環境

OS: Windows10

言語: Python 3.7.0

GUI実装

上の画像がGUIで実装した複数のPDFファイルを結合するアプリケーションです。Pythonにおける実装の仕方はこちらの記事です。ほとんど同じですね… GUI部分の実装はこの人の紹介している PySimpleGUI を用いてファイル選択以外はほとんど同じようにコードを書きました。また、PDFの読み込みには PyPDF2 を使用しました。自分でword等からPDFにエクスポートしたファイルは先に選んだ順にページが配置されるようになっています。出来上がったPDFファイルは実行ファイルと同じ階層にあるディレクトリ”export”に保存されます。ここまで作った後に自分と同じようにGUIでPDFファイルを操作するプログラム作った人いるのかなと思ったので調べたらそういう人がいました。こちらの記事で紹介されていました。先に作られていたそうなのでこの人の書いた記事も参考にしました。これで結合ができるようになった! レポートに表紙を付け忘れたら表紙部分だけ作って本文と結合すれば良くなりました。しかし使っていくうちに色々と問題が出てきました。

ダウンロードしてきたPDFファイルの一部は結合できない

大学で紙の資料を探せない状況なので、インターネットで参考資料を見つけてダウンロードするかもしれません。結合しようとしたときにこんな表示が出ました。

PyPDF2.utils.PdfReadError: File has not been decrypted

どうやら読み込めなかったようです。でもそのファイルはパスワードがついていなくて閲覧はできる状態でした。おそらく何らかの保護がかかっていてページの抽出などの編集操作が許可されていないようでした。解決策を探して見つけたのが “qpdf” というライブラリを導入することでした。qpdf はPDFファイルの内容を維持したまま構造的な変換を行うコマンドラインプログラムです。Windowsでいうならコマンドプロンプトでコマンドを打って、指定のPDFファイルに色々な設定をすることができます。Pythonに対応したライブラリではないので環境変数の設定を済ませてコマンドプロンプトから実行できるようにしました。今回は自分でWord等から変換してPDFファイルを作ったような状態のファイルを生成して、ページを読み取れるようにしたファイルを結合に使うことで解決させました。

exe化が難しい

Pythonのプログラムなので毎回起動するたびにコマンドプロンプトやPowerShell等のターミナルを開いて実行しないといけません。いちいちその作業をするのは面倒なのでWindowsで使える実行ファイル形式(.exe)に変換してあげればダブルクリックしてすぐに起動できるようになります。Pythonをexe化させるライブラリが主に下の3つです。

・pyinstaller
・cx-freeze
・py2exe

使用したライブラリは pyinstallerです。

理由はpyinstaller以外でexeファイルを1つにまとめようとしてもうまく作れなかったり、できても起動ができなかったからです。対応しているPythonのバージョンが指定されていたりオプションの付け方しだいで生成できるのですが、調べてみると人によって方法が違い、私の環境にあった設定がどれなのかわかりませんでした。pyinstallerを使った方法は前述したGUI実装の参考元の人が紹介していました。こちらの記事です。「exe化について」の項目の作り方で単一ファイルを生成できました。できたのですがアプリケーションが起動するのがやや遅いです。pyinstallerはこういうものだと割り切るしかない感じです。起動を早くしたければpy2exeでファイルを生成するといいそうですがその方法は不明です。私は今後Pythonで新しいアプリケーションを作ったらとりあえずはpyinstallerでexe化していくと思います。

ファイルの数だけコマンドプロンプトの画面がちらつく

qpdf はコマンドラインでオプションを付けて実行することでPDFファイルに任意の操作をします。Pythonからコマンドを実行できるようにプログラムしたのでexe化した実行ファイルからでもqpdfのコマンドを呼び出すことが可能です。コマンドプロンプトで実行する関係でファイルを更新するたびにコマンドプロンプトが起動します。これは qpdf を使用しているので対策しようもないと思います(もしかしたら起動しないようにするプログラムの仕方があるかもしれません)。pikepdf というPython対応のライブラリを使えばこの問題を回避できそうですが今回は現状維持でそのままにします。

わからないことが多いけど完成したことにしよう

製品として売り出すわけではなく、サークルもしくは自分だけで使う分にはいいかなと思ったのでサークル内ではこのアプリケーションを共有しています。今回はそもそも自分だけで使おうと考えていなくて誰にも相談していなかったためプログラムもつぎはぎで煩雑です。修正を重ねてこの状態かつこのPDFを結合するプログラムを作るために必要以上に時間をかけてしまったので当面はこれで完成ということにします。

さいごに

今回は微妙な結果になりましたが調べていく間に学べることがあったので悪くはなかったと感じています。今回は一人で開発しましたが周りに相談相手がいると開発が進めやすいし、幾分か気が楽になると思います。作ってみたいソフトウェアがあるけどどうすれば良いかわからない、どこから調べていけばいいのか見当もつかないという人(特に1年生)はDen3に入れば相談相手がいます。なので入部を検討していただければ幸いです。

コメント入力

関連サイト