43号線を西へ東へ

フリーランスの備忘録、アウトプットの実験場

ChatGPTの内容をPDFに書き出す時には「CIDフォントで」と書き足すと日本語が文字化けしない

このブログはプロモーションリンクを含むときがあります


ChatGPTで調べものをして、最後にPDFでまとめる。

そんな流れが、生成AIを使い始めてからの日課になっていました。

ChatGPTからPDFを書き出すと必ず文字化けするので、毎回フォントファイルをアップロードする必要がありました。

アップロードするフォントファイルを選択するのが手間だなぁといつも感じていましたが、簡単な方法が見つかりました。

プロンプトに「CIDフォントで」と書き足せばいいのです。

一人職場で報告書を作成する意義

フリーランスかつ一人会社の代表である私は、上司も部下もいないので日記的な日報は書きますが、業務報告する習慣がありあません。

リサーチの報告書を提出する人が、調査している自分自身ですから。

ここ数年生成AIを使用してからは、変わってきました。ChatGPTたちはまとめる能力が優れているので、ある程度リサーリが進めばまとめをPDFに書き出すようにしていました。

ChatGPTでPDFを書き出すと文字化けする

だが、この流れには小さくも根深いストレスがありました。それが「日本語が文字化けする」という問題です。

ChatGPTが内部でPythonを駆使してPDFを作成する際、ライブラリ「ReportLab」 を使用しているようですが、日本語フォントが埋め込まれていなければ、ビューアによっては文字が「豆腐(□)」に化けてしまいます。

文字化け対策その1・フォントをアップロードすること

これを防ぐために、私は軽量な日本語フォントを手元に置いて、毎回読み込ませていました。フォント埋め込みは、ある種の儀式に。

  1. 「ファイルを追加ボタン」を押して
  2. ダイアログからTTF(フォント)ファイルを検索して
  3. ipexg.fftを選択して
  4. アップロードボタンを押す

これが、何回もやっていると面倒なのです。

その2・CIDフォント

ところが、ある日、ChatGPTがCIDフォント方式を使うようになっていたのです。

たまたまの出来事なのですが、半年ほど前のChatGPTのレポートを書き出そうとしたとき、ファイルのアップロードが出来なかったのです。そのままPDF書き出しをお願いすると、日本語が文字化けしないPDFが出力されました。

推論モデルであるGPT-o1モデルを使用したレポートが、文字化けしないPDFの作り方を教えてくれました。

文字化けするからどうにかしないといけないね、と考えてくれています。さすが推論モデル

何の準備もなしに、日本語が表示される。「なにこれ…便利すぎるじゃないか。」

CIDフォントというものだそうです。

CIDフォント方式とは何か?

CIDフォントは、Adobe社が開発した2バイトの日本語PostScriptフォント形式で、文字を収録したフォントファイルと、文字コードとの対応を定義するCMapファイルで構成されています。特に日本語のような文字数が多い言語に対応するため、グローバルな印刷業界やデジタル出版分野で広く採用されました。

一部を除くPDFビューアーがこのCIDフォントに対応しているので、フォントを埋め込まなくても日本語が表示出来るのだとか。

簡単に言えば、「PDFの中にフォントを埋め込まずに、ビューア側に『このフォントを使ってね』と依頼する形式」がCIDフォント形式です。

ReportLab が指定するのは HeiseiMin-W3(CID Type 0 + Identity-H) という日本語フォント。これは:

  • フォントファイルを埋め込まない
  • CIDと呼ばれる文字IDを元に「このIDに該当するフォントを探してね」と指示を出すだけ

つまり、PDFにはフォント情報が実際には存在しない。後はすべて、ビューア側の“対応力”におまかせする。

ビューアがフォントを探す順序(一般的な仕組み)

優先度 探し方 期待される動作
PDFにフォント埋め込み 完全再現
ビューア内蔵のCJKフォント AcrobatmacOSPreviewなど
OSにインストールされた同名フォント HeiseiMin-W3.otfなど
OSの代替フォントルールによる置換 游明朝、ヒラギノなどへ
置換できず文字化け 軽量PDFビューアや古い機器で「□」が表示

ここで重要なのは、「OSにフォントがある=必ず表示される」わけではないということ。
ビューアがOSのフォント検索APIを呼ぶ設計になっていれば、ようやく意味を持つとのことです。

実際にどう表示されるか?(ChatGPTしらべ)

環境 HeiseiMin-W3の有無 フォント埋め込み 表示結果
AcrobatmacOS 無し(Viewer内蔵) 正常表示
Windows + Edge 無し 游明朝などに自動置換され正常
Windows + SumatraPDF OSフォントあり 正常表示
Android 軽量ビューワ 無し 文字化け(□)

私のMacでは何の苦労もなかったPDFが、Androidの古い軽量ビューアで開くと「豆腐まみれ」になる──事もあるようです。CID方式は便利だけれど、万能ではない事に注意しながら運用する必要がありそうです。

とはいえ、現状の私の環境(MacBook Air、自作WindowsPC、iPhone)では問題なく閲覧が出来ているので、私の場合はCIDフォントを活用していいこうと思います。

実務上どう使い分ける?CIDフォントは取引先でも使えるのか?

私のように一人で完結する場合はいいのですが、一般的な場合は取引先の環境も考える必要があります。

ケース 推奨
社内だけで使う CID方式で軽量PDF化OK
取引先や不特定多数に送付 フォントを埋め込むべき
印刷所へ入稿 ほぼ必ずフォント埋め込みが必須条件

CID方式は「軽くて便利」ですが、受け取る先方さんのことを考えましょうね、ということですね。

フォントを確実に埋め込むには?

以下のように、ReportLabで明示的にフォントを指定すれば、自動的にPDFにフォント情報が埋め混まれます。

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont("HeiseiMinPro", "/path/to/HeiseiMinPro-W3.otf"))
canvas.setFont("HeiseiMinPro", 11)

まとめ

調べ物をしても、あれやこれやとしている中に忘れてしまうことが多いです。特に専門外の経理関係のこと、勘定科目の仕分けルールなどは調べたことさえ忘れている。ということで、まとめPDFを作成するようになりました。

CIDフォントの仕組みを知るまでは、そのまま書き出すと文字化けするので、毎回フォントファイルのアップロードが手間でしたが、これで解決しました。

客先に送信する場合には、閲覧できない可能性があることも念頭に置きつつ、CIDフォント方式を賢く使い分けていきたいと思います。