IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第37回 Pythonのライブラリ「ReportLab」でPDFを作る方法 ~PDFのサイズ、用紙の向き編~ (菱沼佑香) 2022年9月

こんにちは、吉政創成 菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。

さて、前回はPDFを作るライブラリ、ReportLabを使うにあたっての基本的な手順のうち、インポート方法とフォントの指定方法について学習しました。
今回はPDFのベースを作る方法や保存に関係する部分について学んでみたいと思います。

サンプルコード

前回も掲載していますが、一応今回もサンプルコードの画像を載せておきます。
今回はこの中の、「PDFを作る」のあたりの学習になります。

fig01

※出力結果の画像は、今回割愛します。気になる方は前回のコラムをご確認ください。

PDFのサイズの指定と保存場所

PDFを作るには、そのベースとなる「キャンバス」、つまり用紙となる部分をまず作ってあげるようです。


P.243
3. キャンバスを作る
(中略)
いわゆるページ全体のことです。キャンバスを作るには「canvas.Canvas()」を実行し、Canvasオブジェクトを作ります。

fig02

まず1つ目の引用で出力するファイル名を指定します。ここでは「example.pdf」としました。
次に2つ目の引数ではページのサイズを指定します。ここではA4サイズを指定しました。そして、その結果を「pdf」という変数に受け取っています。以下、文字や線、画像などをこの場所に配置する場合に、この変数pdfに対して操作していくことになります。もちろん、pdfという変数名はどのような名前でもかまいません。


ということで、PDFにつける名前と、用紙のサイズがまずはここで指定されました。
名前の設定については特に問題はないかと思いますので、今回はテキストでは特に触れられていない保存場所やPDFのサイズに関係する設定部分について調べてみました。

PDFが保存される場所について

サンプルコードを実行してみた結果、PDFはサンプルコードが保存されている場所に作成されていました。が、実際に使うなら、デスクトップや任意の場所に保存したいことはあると思います。
そこで、試しに[./example.pdf]としてみたところ、一つ上のディレクトリに保存されたので、どうやら相対パスでの指定ができる模様...。
ちなみにデスクトップに保存させたい場合、自分だけで利用する分にはいいのですが、実際にはWindowsを利用している人、Macを利用している人とその環境は異なってきます。そこで、環境に依存せずにデスクトップに保存できるようにする方法を探してみたところ、標準ライブラリに入っているOSモジュールをimportし、OS判定をして、OSに依存している部分をPythonで扱えるようにするという作業でできそうでした。
また、新しいフォルダを作ってそこに保存していきたいという人もいると思いますが、参考サイトにあるOSモジュールで利用できる関数を確認してみるとフォルダの新規作成もできるようなので新規フォルダの中に保存するような設定もできるのだろうと思います。
とりあえずここではデスクトップに保存できるようにしてみたいと思い、追記したのが青枠の部分です。

fig03

ですがこれをWindowsで実行してもデスクトップにファイルができませんでした。
パスを確認してみると、「C:\Users\(ユーザー名)\Desktop」となっていました。一方、私のデスクトップのパスを確認してみると「C:\Users\(ユーザー名)\OneDrive\デスクトップ」となっています。
これについて調べてみると、どうやらWindows10のインストール時にマイクロソフトアカウントを作ってしまう、もしくは、既存のマイクロソフトアカウントを利用して新しいパソコンをセットアップすると起きてしまう現象のためにデスクトップと私が認識していた場所に保存できなかったようです。
OneDriveの設定を変えれば解決できそうではありましたので、一応参考リンクをお知らせします。

参考サイト:
ドキュメントフォルダを移動できない問題に対処。Windows10 「同じ場所にリダイレクトできない」エラー
ドキュメントフォルダー等がOneDriveにリンクされた問題の解決

とはいえ、今回はわざわざ変えるのもと思いましたので一旦放置して、とりあえず以下のように変えてみたところ今度は問題なくデスクトップに保存されました。同じような方がいればご参考に。

fig04

ただ、これだと同じ現象が起きている人にしか使えませんし、ここまで書くならいっそのこと絶対パスで書いた方が良いのか...はたまたOS判定した後にif文にした方が良いのか...とも思いましたが、使う人が誰かによってその時に考えればいいかと思いますので、ゆくゆくはその方法について考えてみたいと思います。
(ちなみに作業用のディレクトリをユーザー名の直下に作成し、その中に保存されるようにした方が良いという話も聞きました。確かにその方が管理もしやすそうです。)

OSモジュールに関する詳細は以下の参考サイトをご確認ください。

OS|公式ドキュメント
Pythonのファイル操作で使うosモジュールの関数16個まとめ|とことん独学ブログ
PythonでOSの種類を判定|PythonエンジニアによるPython3学習サイト

...と、ここまで書いたところで、教えて頂いたのですが、今はpathlibというモジュールがあるそうです。
基本的にOSモジュール(os.path)でやれたことはできるそうで、使い勝手もこちらの方が良いらしく、ほとんどのケースでこちらが利用されるようになっているとのこと。
今回は深堀しませんが、興味のある方は参考リンクもご参照ください。

python pathlibの使い方メモ|Qiita @studio_haneya pathlibモジュールを使ったファイルの読み書き

PDFの用紙サイズの指定

サンプルではA4が指定されており、特に指定しなくてもデフォルト設定はA4らしいのですが、実際にReportLabで使用できる紙のサイズはいくつなのでしょうか。dir関数で調べてみたところ次のサイズが使用できるようです。

サイズ
A A0、A1、A10、A2、A3、A4、A5、A6、A7、A8、A9
B B0、B1、B10、B2、B3、B4、B5、B6、B7、B8、B9
C C0、C1、C10、C2、C3、C4、C5、C6、C7、C8、C9
GOV_LEGAL(215.9×330.2㎜)、GOV_LETTER(203.2×266.7㎜)、HALF_LETTER(139.7×203.2㎜)、JUNIOR_LEGAL(127.0×203.2㎜)、LEDGER(413.8×279.4㎜)、LEGAL(215.9×355.6mm)、LETTER(215.9×279.4mm)、ELEVENSEVENTEEN(279.4×431.8mm)、TABLOID(279.4×431.8)

上記の中で使用したい場合はサンプルコードの中のA4の部分を規定サイズに書き換えればOKですが、それ以外に任意のサイズを細かく指定することもできるそうです。 その場合の記述方法はテキストから引用します。


P.244 任意のサイズにしたいときは、 pdf = canvas.Canvas("example.pdf", pagesize = [210 * unit.mm, 297 * unit.mm]) のように、リストとして幅と高さを指定します。PDFの単位は「ポイント」なので、ミリメートルのように指定したいときは、このように「unit.mm」をかけ算します。


用紙の向き(縦横)の指定

何もしなければデフォルトは縦設定のようですが、横にすることもできるようです。 用紙の向きはreportlab.lib.pagesizesにあるlandscape(横)とportrait(縦)で指定できます。 ということで、以下のように変更してみたところ無事、A4横サイズのPDFができました。

fig05

fig06

それでは今回はこちらで終了です。 最後に公式ドキュメントや参考サイトをご紹介します。ご興味がある方は覗いてみてください。

今回もお付き合いいただきありがとうございました。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes