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

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

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

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

第39回 ReportLabで一枚紙に大きな一文字を描画、改ページの方法は? (菱沼佑香) 2022年12月

こんにちは、吉政創成 菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。
ここ3回ほど、PDFを作るライブラリ、ReportLabを使うにあたっての基本的な手順を学んできました。
(フォントの登録、PDFファイルの保存、文字・画像・図形・線の描画など。)
今回は最後のレッスン、「Lesson8-4:横断幕を作ろう」をやってみたいと思います。

一枚に大きな文字を一文字表示させる

作成するのは用紙1枚当たり1文字を紙いっぱいの大きさで印字したものを一つのPDFファイルに改ページを使って保存させるというものだそうです。
作る文字は「新春セール!」です。コンビニとかで一枚一文字の横断幕...というか、張り紙がしてあるところがありますよね。あれです。あれを作ります。
使用する用紙のサイズはA4(210㎜×297㎜)で、用紙のちょうど真ん中に文字が来るように配置したいようです。(Y座標=(高さ-フォントサイズ)÷2で設定するとのことです。)
そして文字のサイズは用紙の横幅に合わせるということで、「210*unit.mm」とするとありますので、Y座標は(297-210)÷2=43.5ですね。プログラム上では計算式で記述されています。
さてそれが書かれているのが次のサンプルコードで、実行してできたのが右側です。

fig01

若干下に寄っているように見えるのですが、デザイン上の問題とのこと。
気になる方はdrawStringメソッドの座標をずらして、表示位置を調整すればいいようです。
ということで一応試してみたのがこちら。

fig02

変数h(Y座標の値)に25㎜足すことで文字を少しだけ上に移動させました。これで大体真ん中になったように見えます。
ところで、ここまで単位を㎜でずっとやってきていますが、㎝も利用できました。

ReportLabで作るPDFを改ページさせる方法

あとは「新春セール!」という文字を一文字ずつ用紙に印字してあげればいいのですが、ファイルを一つにしたいですよね。それには、改ページ処理を行う必要があります。
----
引用P.247
単純にforループを使って文字列を1文字ずつに分けて、ループ処理でページを作ればいいのです。
(中略)
このプログラムでは、基本的にはforループで、文字数分だけを繰り返し実行しているだけですが、ここで新しく使った機能として「改ページ」という処理があります。
ReportLabモジュールを使ってPDFを作成する場合、「pdf.showPage」のようにshowPageメソッドを呼び出すと、その場所で改ページします。もし、この記述を忘れてしまうと、すべての文字が重なって1ページに印刷されてしまうので注意してください。
-----
という事で、そのサンプルコードが次の画像です。

fig03

青と緑の枠線で囲まれたところが追記された箇所です。
forループによってmojiに、titleで設定された文字が一文字ずつ代入されていき、代入されるごとに改ページ処理である「pdf.showPage」も一緒に処理されているようです。
そしてこれを実行するとできるのが次のPDFです。

fig04

確かに改ページされていることが確認できました。
フォントを変えたい場合は第36回で変え方を書いていますので、そちらをご参照ください。
ということで、テキストはここで終了になっています。
最後に参考情報だけお知らせしておきます。

より高度なことをしたい方向け:改ページを自動でさせたいとき

今回作ったのは短文ですが、実際にPDFにさせたいものは文書だと思います。もしその文書が何らかの処理によって自動で出来上がったものだったり、長めの文書だったりした場合、出来上がった長文の文書をどこで改ページさせるかというのを毎回指定するのは面倒ですよね。
そういう時に自動で改ページをしてくれる方法がないかと探してみたところ、参考になりそうなサイトがありましたのでご紹介します。

Python3: reportlab で自動で改ページをする

より高度な方をしたい方向け:ページ番号の付け方

ページ番号をつけたいという人も多いと思います。どちらかというと既にできてしまっているPDFにページ番号を追加する方法ばかりですが、参考サイトをご紹介します。

Pythonで既存PDFに文字(ページ番号)を追加する方法

PDFファイルにページ番号を追加する方法(Pythonで)

Python3 PDFにページ番号を付与する

PDFにページ番号を追加

Reportlab: How to Add Page Numbers

さいごに

さて、ここまで39回に渡って「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に、プログラミング超初心者なりにPythonの学習を行ってきましたが、まずはやり切れたことに安堵しています。
素人範囲から抜け出せたとはなかなか言えませんが、プログラミング、それも話題のPythonという新しい分野への挑戦ができたことで、今まで「プログラミングは自分には関係のないもの」という意識が変わり、あの業務をプログラム化したら楽になりそうだな、ああいう事やってみたいな、実現するにはどうすればいいかなということを考えるきっかけになりました。この機会を頂けたことにとても感謝しております。
超初心者によるコラムでしたが、同じくこれからPythonへの挑戦をスタートされるどなたかのお役に少しでも立つことがあれば幸いです。
最後に、ご覧いただき、ありがとうございました。

 


 

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