Pygments で日本語フォントの画像を出力する方法

Posted on 2024年03月28日 (木) in 一般

アイキャッチ

目次

はじめに

Pygments は、様々な言語のソースコードを解析し、色を付けて出力することなどができる Python ライブラリです。

出力方法としては、一般的に HTML が使用されますが、Pillow を使用することで画像としても出力することができます。

画像として出力する際のコードの一例です。

from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import ImageFormatter

code="""
print("Hello World")
"""
path="output.png"
lexer = get_lexer_by_name("python")
formatter = ImageFormatter(style="default")
with open(path, 'wb') as f:
    highlight(code, lexer, formatter, outfile=f)

基本的にこの簡単なコードで画像を出力することができるのですが、一つ問題があります。

それはコードの中に日本語が入っていると、□ に文字化けしてしまうということです。

今回はその解決策を書いていきます。

日本語出力方法

このように日本語が文字化けする原因は、この手の問題でよくあるフォントが日本語に対応していないからです。

日本語に対応させるためには、ImageFormatterのなかにある引数のfont_sizeで日本語等幅フォントを指定すれば解決できます。

しかしここに「BIZ UD ゴシック」や「BIZ-UDGothicB」など名前そのままで指定しても、認識されずにエラーを吐いてしまします。

このfont_nameの引数でフォント名を指定するには、レジストリに登録されている名前で入力する必要があるのです。

そのためまずはレジストリからフォント名を確認する必要があります。

「Win+R」で出てくる「ファイル名を指定して実行」に「regedit」を入力するとレジストリエディタが開き、
そこから「コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts」
を開いていくとフォント一覧が出てきます。

その中にあるフォント名がfont_nameで使えるフォント名となります。

例:BIZ UDGothic & BIZ UDPGothic (TrueType);

なので先程のコードに加えると、

```python
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import ImageFormatter

code="""
print("Hello World")
"""
path="output.png"
lexer = get_lexer_by_name("python")
formatter = ImageFormatter(style="default",
                          font_name="BIZ UDGothic & BIZ UDPGothic (TrueType);")
with open(path, 'wb') as f:
    highlight(code, lexer, formatter, outfile=f)

となります。

このような方法で、他のフォントを使うことができます。

終わりに

今回のやり方は Yukis Army knife に「コード画像化」を追加する際に少し手こずった時に見つけたものです。

Pygments はコードの画像化以外にも、コードを入力・出力するタイプのソフトやアプリの開発にも使えそうなので、このライブラリを覚えておくと便利だと思います。

(見落としがなければ)公式ドキュメントにも詳しい解説が無くフォント名を指定するとしか書いてなかったので、今回の記事が誰かの役に立つと嬉しいです。