Toolkitが提供するPlatypusモジュールを使うと便利だ。f"これは{i}番目の段落ですよ。onLaterPages=makeLaterPages)buildPDF()ReportLabによるPDF作成Pythonで文字列やテキストファイルからPDFファイルを作成するには幾つかの方法がある。Toolkit」を使う方法を紹介する。注意なお、本稿は公式サイトのドキュメントを基にした筆者による独自研究の側面が強く「こうしたらうまくできた」という情報でしかないことには留意されたい。ソースコードはここからダウンロード可能なので、興味のある方はソースコードにも目を通してみよう。reportlab」などのコマンドによりあらかじめこれをインストールしておく必要がある。PDFファイルにテキストを出力するだけであれば、以下のようなコードを実行すればよい。World!')c.showPage()c.save()reportlab.pdfgen.canvasモジュールのCanvasクラスのインスタンスを生成すると、その第1引数に指定したファイル名でPDFファイルが作成される。pagesizeパラメーターに指定しているのは用紙サイズで、ここではreportlab.lib.pagesizesモジュールからインポートしてA4サイズを指定している(といっても、width/height変数に代入していることから分かる通り、A4はその高さと幅を要素とするタプルだ)。World!'を出力している。showPageメソッドで現在のページを終了して、saveメソッドはPDFファイルの保存とクローズを行っている。Code)にvscode-pdf拡張機能をインストールした環境で上記コードを実行し、作成されたPDFをオープンしたものだ。実行結果しかし、上のコードから分かる通り、reportlab.pdfgen.canvasモジュールのCanvasクラスが提供する機能は極めて基本的なものであり、ページのどの位置にどんなテキスト(あるいは画像や図形)を出力するかをプログラマーが明示する必要がある。Scripts)」を使用する。詳しくはドキュメントを参照してほしいが、Platypusにはドキュメントテンプレートやページテンプレート、パラグラフ(段落)、行間などの概念があり、これらの要素を用いて比較的シンプルにPDFファイルにテキストを書き出せる。reportlab.platypusモジュールのSimpleDocTemplateクラスを使った場合の典型的なPDF作成のスケルトンコードは次のようになる。以下ではPlatypusのドキュメントにあるチュートリアルコードを基にReportLabに標準で含まれている平成明朝体W3と平成角ゴシック体W5を使用して、機械的に作成した段落からPDFファイルを作成するようにした冒頭のコードを上記スケルトンコードに照らし合わせながら見ていこう。必要なもののインポートここで必要としたのは以下のものだ。UnicodeCIDFontSimpleDocTemplateクラスはその名の通り、シンプルなドキュメント用にあらかじめ用意されているテンプレートだ。Paragraphクラスは本文を構成するパラグラフ(段落)を表す。Spacerクラスは段落間の空きを表す。getSampleStyleSheet関数は標準で用意されているスタイルシートを取得する。本文を構成するパラグラフは、ここから得られるスタイルを基にフォント名やフォントサイズが指定される。defaultPageSizeオブジェクトはA4サイズの高さと幅を要素とするタプルだ(上で見たA4と同じ)。inchはページ番号の表示位置や1ページ目冒頭の空きの計算に使用している(その値は72.0で、1ポイントが72分の1インチであることからその値になっていると思われる)。pdfmetricsモジュールとUnicodeCIDFontクラスは上で述べた平成明朝体と平成角ゴシック体をPDFファイル内で使用できるように登録するために使用する。以下のコードでは、上で見たdefaultPageSizeから、このPDFファイルの高さと幅を取得するとともに、getSampleStyleSheet関数でスタイルシートを変数stylesに取得している。stylesは辞書的に使え、この後で「styles['Normal']」のようにして通常のスタイルをそこから取得し、通常のスタイルに対して日本語フォントを使うように指定する。日本語を使うための設定が最後の2行だ。getSampleStyleSheet()pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))最後の2行ではregisterFont関数を使って平成明朝体と平成角ゴシック体をPDFファイル内で使えるように登録している。このときに指定した2つの文字列('HeiseiMin-W3'と'HeiseiKakuGo-W5')を使って、この後でフォントを指定することになる。外部からフォントをダウンロードして使用するときには、そのフォントを保存しているパスと、フォントの種類に応じて例えば次のようなコードを書くことでフォントを登録できる。IPAEXG))これはIPAが提供しているIPAexフォントのIPAexゴシック体を登録するコードだ。ライセンスに同意した上で、フォントをダウンロードしてローカルのディレクトリ(fonts/ipaexg00401)に配置し、その名前('ipaexg')とパスを使ってregisterFont関数で登録している。このときにはTTFontクラスでラップしている点にも注意しよう。1ページ目の描画に使用する関数の定義SimpleDocTemplateクラスのbuildメソッドでは1ページ目の描画に使用する関数と2ページ目以降の描画に使用する関数を分けて指定するようになっている。これはドキュメントの先頭ページは2ページ目以降とは異なる処理(画像の配置など)が必要になるためだろう。ここでは上部に余白を取り、PDFファイルのタイトルを表示するようにしている。本文はその後に出力される。canvasの状態を復元この関数(および、2ページ目の描画で使用する関数)はbuildメソッドから呼び出されるコールバック関数であり、そのcanvasパラメーターにはPDFファイルを構成するページが、docパラメーターにはドキュメントの内容を表すオブジェクトが渡される。saveStateメソッドはページの内容を表すオブジェクトの状態(フォントやその他の情報)を一時的に保存しておくためのものだ。最後のrestoreStateメソッドで状態が復元されるので、その間はフォントの設定などを自由に行える。ここで行うフォントの設定は本文の描画とは無関係である点には注意されたい。コードをよく見ると分かるが、ここで行っているのは、docパラメーターから取得できるドキュメントのタイトル(doc.title属性)とページ番号(ノンブル)の描画だけだ。本文は恐らくbuildメソッドの中でレイアウトが計算され(本文の段落のどこまでがどのページに収まるかなど)、自動的に描画される。2つあるsetFontメソッド呼び出しは、最初がドキュメントのタイトルを表示するためのもので、フォントサイズを少し大きめにしている。2つ目のものはページ番号を表示するためのものでフォントサイズを小さめにしている。このような変更は、上でも述べたようにrestoreStateメソッド呼び出しにより元の状態に戻される。2ページ目以降の描画に使用する関数の定義2ページ目以降の描画に使用する関数は1ページ目の描画に使用する関数と同様だ(ただし、ドキュメントのタイトルを描画する必要がないのでよりシンプルになっている)。canvasの状態を復元ページ番号はdocパラメーターのpage属性で取得できる点に注目されたい。それ以外は説明の必要はないだろう。PDFファイルを作成する2つの関数が定義できたら、後はPDFファイルを作成する関数を定義する。f"これは{i}番目の段落ですよ。onLaterPages=makeLaterPages)ここではSimpleDocTemplateクラスのインスタンスを生成して、そのtitle属性にドキュメントのタイトルを設定している(これが1ページ目の描画に使用する関数で使われる)。Story変数はドキュメントの本文を構成する要素を格納するリストだ。最初にSpacerクラスのインスタンスを格納しているが、これは1ページ目冒頭の余白となる。次に「styles['Normal']」としてstyle変数に通常のスタイルを取得して、そのfontName属性とfontSize属性、leading属性を設定している。これらは本文の出力に使用するフォントとそのサイズ、段落の行間の指定となる。その後のfor文では「これは0番目の段落ですよ。」「これは1番目の段落ですよ」といった文字列を20回繰り返したものを本文構成要素(段落)として、Paragraphクラスのインスタンスの生成時に指定し、できたParagraphクラスのインスタンスを上で述べたStory変数のリストに追加している。段落間の空きとしてSpacerクラスのインスタンスも追加している点には注意しよう。ループが終わり、Story変数に全ての本文構成要素が追加されたら、buildメソッドを呼び出す。このときには先ほど定義した2つの関数をonFirstPageパラメーターとonLaterPagesパラメーターに指定する。これにより、1ページ目と2ページ目以降で異なる処理でページが描画されるようになる。Codeで以上のコードを実行して、作成したPDFファイルをオープンしているところを以下に示す。実行結果テキストファイルからPDFファイルを作成これだけでは何なので、解決!Pythonの前回の記事「PDFファイルからテキストや画像を抽出するには」から冒頭のプログラムコードやURLへのリンクなどを取り除いたピュアテキストファイルを作成して(sample.txtファイルとする)、これを基にPDFを作成するコードを以下に示す。onLaterPages=makeLaterPages)buildPDF関数とはドキュメントのタイトル(doc.title属性)と、ドキュメントの本文を作成するループが異なるだけなので、説明は不要だろう。以下はその実行結果だ。実行結果プログラムコードの書体を変更したいといった希望があるのであれば、SimpleDocTemplateクラスを使わずに自前で色々と処理する必要があるだろうが、この程度の出力でも許容できるのであれば、ここで述べた方法で比較的簡単にPDFファイルを作成できるだろう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。