解決!Mac matplotlibの日本語PDFがAcrobatで文字化け
macOSをVentura 13にバージョンアップして以来、matplotlibで日本語含むグラフを作成しPDF化すると、Adobe Acrobat Pro & Reader上で文字化けするようになった。Preview.appだと正常に見えるので気付かず共有する危険がある。また、日本語フォントに限られた問題でなく、中国語繁体字フォントでも同じ現象を確認した。以前の記事でファイルを修復する弥縫策を紹介したが、今回はもっと根本的に解決する。
環境: macOS Ventura 13.1, conda 22.11.1, Python 3.11.0, numpy 1.24.1, matplotlib 3.6.3。matplotlibを日本語化するjapanize_matplotlibは前回試して効果なかったこと、japanize_matplotlibなしでも日本語グラフの作成自体には問題ないことから使用していない。
問題
問題のPDFの例である。フォントにヒラギノゴシック(Hiragino Sans) を設定し作成したPDFは、(1) Previewで開くと正常だが、(2) Acrobatで開くと全角半角全ての文字が化けている。中国語繁体字フォントPinFang HKでも同様の現象が認められる(3, 4)。英字フォントのHelveticaと組み合わせると、(5) Previewではもちろん正常。英数字が若干しゅっとしてHelveticaに置き換わったのがわかる。(6)そしてAcrobatでも英数字が正しく表示されるようになった。しかしかな・漢字は依然化けている、というか消えている。
このコードで上の図を作成した。
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import rcParams
rcParams['pdf.fonttype'] = 42
rcParams['font.family'] = 'Hiragino Sans'
# 英字フォントと組み合わせる場合 rcParams['font.family'] = ['Helvetica', 'Hiragino Sans']
x = np.linspace(-np.pi,np.pi)
y = np.sin(x)
fig, ax = plt.subplots(figsize=(2,1.5))
ax.plot(x,y)
ax.set_xlabel('これがX軸')
ax.set_ylabel('これがY軸')
ax.set_title('正弦曲線')
plt.tight_layout()
fig.savefig(f"{'-'.join(rcParams['font.family'] )}.pdf")
調べてみるとmacOS付属の日本語、中国語フォントはOsakaを除きことごとくAcrobatで正しく表示されないことが分かった。
- Hiragino Maru Gothic Pro
- Hiragino Mincho ProN
- Hiragino Sans CNS
- Hiragino Sans GB
- Toppan Bunkyu Gothic
- Toppan Bunkyu Midashi Gothic
- Toppan Bunkyu Midashi Mincho
- Toppan Bunkyu Mincho
- Tsukushi A Round Gothic
- Tsukushi B Round Gothic
- YuGothic
- YuMincho
- PingFang HK
Osakaを英字フォントと抱き合わせPDFを出力するとAcrobatで正常に表示される。面白いことにOsakaを単独で用いるとPreviewでも開けない壊れたPDFが生成される。
新規インストールしたmacOS Ventura 13.1、新規Macユーザアカウント、新規インストールしたminicondaで導入したPython numpy, Matplotlibのみの新規仮想環境、とこれだけまっさらな環境にしてもAcrobatでの日本語フォント文字化けには再現性があった。筆者の環境に特異的な現象ではなく、macOS Venturaあるいはmatplotlibないしその初期設定に問題があるのだろう。
解決
日本語フォントIPAexを導入することであっさり解決した。
導入法
- 上のリンクからフォントをダウンロード
- 解凍してttfファイルを /Library/Fonts または ~/Library/Fonts にコピー
- ターミナルで
rm -f ~/.matplotlib/fontlist-v330.json
と打ってmatplotlibのフォントリストを一旦削除する - Pythonを起動する
- グラフ作成のPythonコードでかな・漢字フォントにIPAexフォントを指定する。上の例だと行6を
rcParams['font.family'] = ['Helvetica', 'IPAexGothic']
に変更
システム付属のフォントが使えないのは心残りですが、IPAexはゴシック体も明朝体も癖がないきれいな字体なので、matplotlibの日本語は悩まずこれ1本でいいでしょう。
“解決!Mac matplotlibの日本語PDFがAcrobatで文字化け” に対して1件のコメントがあります。
コメントは受け付けていません。