日本語PDF編集で文字化けする原因|CID・CMapとPDF Geckoの処理
日本語PDFの編集では、画面に正しく表示されている文字でも、保存後に文字化け・文字幅の変化・位置ずれが起こることがあります。これは日本語PDFで使われるフォントと文字コードの仕組みに関係します。
最初に知っておきたい結論
日本語PDFで「文字が読める」ことと、「その文字を同じフォント・同じ位置で置き換えられる」ことは別です。表示には必要な情報があっても、編集に必要な文字対応情報が揃っていない場合があります。
PDF GeckoはPDFを開いて文字の追加、白塗りによる見た目の修正、注釈、ページ操作を行えますが、すべての日本語PDFの内部文字情報を完全に置換することを保証するものではありません。
日本語PDFは扱う文字数が多い
日本語では、ひらがな、カタカナ、漢字、全角記号、半角記号、英数字など、多数の文字を扱います。PDFではこれらの文字を表示するために、フォントと文字コードの対応が使われます。
英数字中心のPDFよりも、日本語PDFではフォントの埋め込み方や文字番号の対応が複雑になりやすく、コピー・検索・編集の結果に差が出ることがあります。
CIDフォントとは
CIDはCharacter Identifierの略で、フォント内の文字を識別する番号です。日本語PDFでは、Unicodeの文字そのものではなく、CID番号を使って文字を示す形式が使われることがあります。
同じ見た目の文字でも、PDF内部ではCID番号として保存されている場合があります。編集ツールがその番号と実際の文字の対応を復元できなければ、元の文字を安全に書き換えることは難しくなります。
CMapの役割
CMapは、PDF内の文字コードやCIDと、文字の対応を扱うための情報です。PDFがどの文字を描画するかを判断するために使われます。
CMapが独自形式である、必要な情報が不足している、または対象文字の対応が含まれない場合は、文字を選択できても、別の文字に置き換えるための符号化ができないことがあります。
ToUnicodeがある場合とない場合
ToUnicode CMapは、PDF内の文字番号をUnicode文字へ対応付ける情報です。これがあれば、PDFの文字をコピー・検索・抽出するときに正しい文字として扱いやすくなります。
ToUnicodeがない、または不完全なPDFでは、画面では正しく見えても、コピーすると別の文字になる、検索できない、編集候補を作れないといったことがあります。
サブセット化フォントの影響
PDFではファイルサイズを抑えるため、文書内で使われた文字だけを含むサブセットフォントが埋め込まれることがあります。元の文書にない文字を追加すると、そのフォントに必要な字形が存在しないことがあります。
その場合、別のフォントで描画され、文字幅、改行位置、行間、太さが変わることがあります。見た目が少し異なるだけでも、帳票や契約書では確認が必要です。
PDF Geckoが解析する情報
PDF Geckoのコードには、PDF内のToUnicode CMapを解析し、Unicode文字からCIDコードを逆引きする処理があります。CMap内のbeginbfcharやbeginbfrangeを読み取り、置換候補を組み立てます。
この処理は、PDF内に対応情報がある場合に限って候補を作るものです。対応表が存在しても、編集後のすべての文字を同じCIDコードで表現できるとは限りません。
直接置換で検討する文字表現
実装ではUTF-16BE、BOM付きUTF-16BE、UTF-8、PDF literal string、CID/CMapによる16進表現を候補として扱います。PDFによって文字が保存される形式が違うため、ひとつの形式だけでは判断できません。
元の文字列と新しい文字列の長さや形式が安全に扱えない場合は、候補を採用しません。特にCID/CMapでは、置換先の文字をCMapから逆引きできることが前提になります。
rawデータとFlate圧縮ストリーム
PDFの文字情報が圧縮されていないrawデータに存在する場合は、同じ表現が一意に見つかるかを確認する処理があります。複数の場所に一致する場合は、別の箇所を変えるリスクがあるため安全側に倒します。
FlateDecodeで圧縮されたストリームでは、いったん展開して候補を探し、変更後に再圧縮します。再圧縮後のデータが元のストリーム領域に収まらない場合も、直接置換は行いません。
現在の保存処理が選ぶ経路
現在の保存処理では、既存PDFテキストを編集したページは、直接置換よりも見た目の合成を優先して書き出します。元の文字と新しい文字が重なって表示される状態を避けるためです。
この経路では編集済みページを画像として合成し、新しいPDFページに配置します。見た目の確認には適しますが、元の日本語テキストが出力後も選択・コピーできることは保証されません。
文字追加と既存文字の置換は異なります
新しく文字を追加する操作は、既存の文字列を置き換える操作とは異なります。追加文字には、利用できるフォントや描画方式が使われます。
既存文字を白塗りで隠して新しい文字を重ねる方法は、見た目を修正するための方法です。元のPDF内部の文字情報、検索結果、コピー結果まで更新するものではありません。
文字化け・位置ずれを確認する手順
編集前に、対象の文字を選択してコピーし、別の場所へ貼り付けてみてください。コピー結果が崩れるPDFは、文字情報の扱いにも注意が必要です。
次に、少量の文字だけを編集して保存し、保存後のPDFを開き直します。文字化け、文字幅、改行、ベースライン、ページ内の位置を確認してから、本格的な編集を進めてください。
PDF Geckoが向いているケース
PDFに補足の文字を追加したい、注釈を残したい、白塗りで見た目を修正したい、ページの並び替えや削除をしたい場合は、PDF Geckoで作業できる場合があります。
既存文字の表現が単純で、保存後の見た目を確認できる軽微な修正にも使えます。重要なのは、元のファイルを残し、書き出した結果を必ず確認することです。
別の方法を検討した方がよいケース
スキャンPDFをOCRで認識して全文を編集したい場合、元の文書と完全に同じフォントで大量の文字を置き換えたい場合、複雑なCID/CMapや編集制限があるPDFを扱う場合は、元データまたは専用ソフトを検討してください。
提出先が文字検索、コピー、アクセシビリティを必要とする場合も、見た目だけではなく出力後の文字情報を確認する必要があります。
関連するPDF Geckoのガイド
日本語PDFに限らず、PDFの文字が編集できない原因は、PDFの文字が編集できない原因|PDF Geckoの処理方式も解説で確認できます。
文字位置やフォントが変わる理由は、PDF編集で文字位置やフォントがずれる理由を参照してください。実際の文字追加や保存の流れは、PDF内のテキストを無料で編集する方法で案内しています。
保存前のチェックリスト
元のPDFを別名で保管し、変更したページだけでなく前後のページも確認してください。行の折り返しや文字サイズの変化は、周辺レイアウトにも影響する場合があります。
日付、金額、氏名、住所、契約条件など重要な項目は、元のPDFと見比べてください。PDF Geckoの保存結果は、用途に必要な表示と文字情報を利用者自身が確認したうえで使用してください。