【Python】xhtml2pdfで作成したPDFの日本語対応

【Python】xhtml2pdfで作成したPDFの日本語対応 プログラミング

「Pythonで日本語対応したPDFを作成したい」
「xhtml2pdfで作成したPDFが文字化けしている・・・」

このような場合には、この記事の内容が参考となります。
この記事では、xhtml2pdfで作成したPDFの文字化けを解消する方法を説明しています。

本記事の内容

  • xhtml2pdfで作成したPDFの文字化け
  • @font-face
  • 日本語フォント
  • 文字化け解消の動作確認

それでは、上記に沿って解説していきます。

xhtml2pdfで作成したPDFの文字化け

xhtml2pdfについては、次の記事で解説しています。

xhtml2pdfにより作成したPDFでは、日本語が文字化けします。
文字化けの状況は、次のような感じです。

文字化けの部分は、日本語です。
帳票系の場合、基本的には文字化けすると考えたほうがよいでしょうね。

この文字化けを解消する方法は、意外と簡単です。
設定ファイルを修正するとかややこしいことはありません。

ただ、CSSの知識が少し必要になります。
あと、日本語フォントも必要です。

それらに関して、以下で説明します。

@font-face

@font-faceが、xhtml2pdfにおける文字化けを解消するキーになります。

@font-faceは、CSSのアットルールと言われるモノです。
@font-faceには、ダウンロードすべき外部フォントに関する指定を記述します。

具体的には、次のような記述になります。

「Open Sans」という名称でフォントを宣言しています。
そして、その中身となる外部フォントをsrcに設定します。

上記例では、複数を指定しています。
複数指定することにより、ブラウザに最適なフォントが選択されるようです。

ただし、xhtml2pdfでは1つだけの指定で十分でしょう。
そして、format部分も不要です。

あと、urlに設定するものがURLである必要がありません。
ここでは、URLをブラウザでアクセス可能なパスと定義します。

しかし、xhtml2pdfでは実際のファイルパスを指定することになります。
つまり、URLではなくファイルパスを指定します。

    @font-face {
      font-family: "my_lang";
      src: url("/opt/font/ipaexg.ttf");
    }

なお、「font-family」には自分で決めた名前を指定できます。

以上、@font-faceについて説明しました。
次は、日本語フォントについて確認します。

日本語フォント

日本語のフォントを用意する必要があります。
ここでは、IPAexフォントをダウンロードしましょう。
IPAexフォントは、無償で使える高品質の日本語フォントです。

IPAexフォント Ver.004.01
https://moji.or.jp/ipafont/ipaex00401/

上記ページから、ダウンロードできます。

ダウンロードするファイルは、明朝とゴシックのパックでよいでしょう。
ダウンロードしたzipを解凍すると、以下の2ファイルを確認できます。

  • ipaexm.ttf(IPAex明朝)
  • ipaexmgttf(IPAexゴシック)

これで日本語フォントを用意することができました。

以上、日本語フォントについて説明しました。
次は、文字化け解消の動作確認を行います。

文字化け解消の動作確認

xhtml2pdfの仕様を理解している前提で説明を進めます。
xhtml2pdfで利用するhtmlファイルを以下とします。

template.html

<html>
<head>
  <title>xhtml2pdfの日本語化</title>
  <style type="text/css">
    @font-face {
      font-family: "my_lang";
      src: url("/opt/font/ipaexg.ttf");
    }
    html, body {
      font-family: "my_lang";
    }
  </style>
</head>
<body>
  <h1>xhtml2pdfの日本語化</h1>
</body>
</html>

「/opt/font/ipaexg.ttf」は、用意した日本語フォントのファイルパスです。
ここの値は、各自の環境に合わせて変更してください。

また、宣言した「my_lang」をhtml全体に適用させています。

    html, body {
      font-family: "my_lang";
    }

そして、次のPythonコードを用意します。
template.htmlと同じディレクトリ上にPythonスクリプトを保存しましょう。

from xhtml2pdf import pisa

# htmlファイル名
html_file = "template.html"
# PDFファイル名
output_filename = "output.pdf"

if __name__ == "__main__":

    with open(html_file) as source:
        source_html = source.read()

        with open(output_filename, "w+b") as file:
            pisa_status = pisa.CreatePDF(src=source_html, dest=file)

上記コードを実行した結果、「output.pdf」が作成されます。

output.pdf

日本語が文字化けしていませんね。

以上、文字化け解消の動作確認を説明しました。

タイトルとURLをコピーしました