開発ノート

日本語のPDFは難しい

出来事の時期:2026年5月24日〜5月25日

最終更新:2026年9月6日

ArchiveSealは、運営者が開発しているChrome拡張です。

保存したページをPDFにして書き出す部分を作ったとき、そこに日本語を出すところで、2日間に4回、別々の壊れ方をしました。 字が出ない、画面が固まる、数字が読めない字に化ける、ファイル名から濁点が消える。

どれも原因が違います。共通していたのは、日本語だからという理由でだけ起きることでした。

何が起きたか

PDFに文字を出すには、字の形のデータをファイルの中に持ち歩く必要があります。英語なら、PDFを開く側が最初から持っている字で足ります。日本語はそうはいきません。

そこで、日本語の字形をひとまとめにしたデータを同梱することにしました。ここから始まります。

① 日本語が全部、四角い箱になった

書き出したPDFを開くと、日本語の部分がすべて になっていました。文字は入っているのに、形が出てこない。

原因は、同じデータを二度絞っていたことでした。

持ち歩くデータを軽くするため、必要な字だけに絞ったものを用意していました。ところがPDFを作る部品にも、同じように「使う字だけ残す」働きがあります。すでに絞ってあるものをもう一度絞った結果、残しておくべき字形まで落ちていました。

二度目の絞り込みをやめて直りました。そのぶんファイルは重くなりますが、字が出ないPDFに意味はありません。

② 画面が固まり、「応答なし」と出た

字は出るようになりましたが、今度は書き出しのたびに画面が止まりました。ブラウザが「このページは応答していません」と出すところまでいきます。

原因は2つありました。書き出すたびに字形のデータを読み直していたこと。そして、描画の処理を一息に走らせていたことです。

一度読んだデータは覚えておくようにし、処理を細かく区切って、あいだに画面を描き直す隙を入れました。重い処理を止めるのではなく、途中で息継ぎをさせる形です。

③ URLの数字が、読めない字に化けた

ページの見出しに元のURLを入れているのですが、そこの数字が知らない字になっていました。Prod/1/01 が、まったく別の記号列として出ます。

原因は意外なところにありました。同梱していた日本語の字形データが、一部の英数字に別の絵を割り当てていたのです。PDFを作る側はそれを疑わずに、そのまま埋め込んでいました。

④ ファイル名から濁点が消えた

保存したファイルの名前が、こうなっていました。

元の名前保存されたファイル名
モバイルモハ_イル
ゲームケ_ーム
パンハ_ン

濁点と半濁点だけが、すべて _ に置き換わっています。

原因は、日本語の文字の表し方が1通りではないことでした。「バ」は1文字として表すこともできますが、「ハ」と「濁点」を隣り合わせに並べる形でも表せます。 こちら側には後者の形で渡ってきていて、途中の処理が濁点だけを扱えずに落とし、代わりに _ を入れていました。

何を決めたか

この記録で「決めた」と言えることは、2つしかありません。残りは壊れて直した記録です。

① 文字ごとに、使う字形を振り分ける

数字が化けた件への対処です。同梱した日本語のデータに任せきりにせず、英数字はPDFを開く側が最初から持っている字を使い、それ以外だけを同梱したデータで描くことにしました。

日本語のために持ち込んだものが、英数字の表示を壊していた。持ち込んだものの守備範囲を、こちらで決め直した形です。

② 配布の上限を優先して、新しいデータを採らない

字形のデータには、もっと新しく扱いやすいものもありました。ただし容量が2倍以上あり、そちらを同梱すると配布の上限を超えます。

軽さと引き換えに扱いにくさが残りますが、入らないものは入らないので、古いほうを使い続けることにしました。上限を超えれば配布そのものができません。

どうなったか

4つ目の濁点の件は、直す場所が1か所で済みました。

ファイル名を整える処理が1か所にまとまっていて、そこを通ればPDFもJSONも、個別も連結も、フォルダ名も全部通ります。入口が1つだったので、直しも1つで足りました。

ここは運が良かった部分です。もし名前を整える処理が経路ごとに散らばっていたら、4か所を別々に直して、どれか1つを直し忘れていたはずです。

2日間で、日本語のPDFは一応出るようになりました。ただしこの2日で全部の壊れ方を踏んだわけではなく、あとになって別の形が出てきます。

分かったこと・まだ分かっていないこと

軽くする処理が、必要なものを捨てることがあります。

字が出なくなった原因は、良かれと思って二度絞ったことでした。片方だけなら正しく、両方やると壊れる。それぞれの処理は「使わない字を落とす」という正しい仕事をしていて、組み合わせたときだけ間違いになります。

分かったことは2つです。

  • 日本語のために持ち込んだものが、日本語以外を壊すことがある。 字形のデータは日本語を出すために入れたのに、英数字の表示を壊していました
  • 同じ文字が1通りに表されるとは限らない。 見た目が同じでも、内側の形が違うことがあります

分かっていないこともあります。濁点の件が、どこで形を変えられているのかは特定できていません。 こちらに届いた時点でその形になっていたことは分かりますが、その手前のどこで変わったのかは追い切れませんでした。入口で形を揃えることで結果は直っていますが、原因の場所は分からないままです。

PDFの中の文字がどう扱われるかはPDFの文字検索のやり方に、崩れたときの切り分けはWebをPDFにすると崩れる/文字化けする原因と解決法に書いています。

この記録の更新履歴

  • 2026年9月6日 初版。日本語をPDFに残すまでに順に現れた4つの壁を記録