日本語のPDFは難しい
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つの壁を記録
