PDFの内部構造

PDFの文字が編集できない原因|PDF Geckoの処理方式も解説

PDFを開いて文字が読めても、その文字を元のデータのまま置き換えられるとは限りません。PDF Geckoの現在の処理方式と、編集できるPDF・難しいPDFの違いを、実際の実装に沿って説明します。

結論:見た目の文字と編集できる文字は別です

PDFは、画面や印刷で同じ見た目を再現するための形式です。一般的な文書ファイルのように、すべての文字が一続きの編集可能な文字列として保存されているわけではありません。

そのため、コピーできるPDFでも編集後にフォントや位置が変わる場合があり、スキャンPDFではそもそも既存文字を選択できない場合があります。

PDFの文字はコンテンツストリームに記録されます

PDFでは、文字、フォント、位置、描画命令などがページ内部のコンテンツストリームに記録されます。画面に表示される1行の文章が、PDF内部でも同じ形の文字列として存在するとは限りません。

文字が複数の断片に分かれていたり、文字番号とフォントの対応で表示されたりするため、見た目だけから安全に置換できないケースがあります。

原因1:スキャンPDF・画像PDF

紙をスキャンして作成したPDFは、ページ全体が画像になっていることがあります。文字が見えていても文字データが含まれないため、既存の文字を直接選択・置換することはできません。

この場合はOCRで文字認識を行うか、元の文書データを使う必要があります。PDF Geckoは画像PDFの文字をOCRで全文編集する機能を提供していません。

原因2:フォント・CID・CMap

日本語PDFでは、CIDフォントやCMapを使って文字を表示することがあります。CIDはフォント内の文字番号、CMapはその番号と文字の対応を扱う仕組みです。

PDF GeckoのコードにはToUnicode CMapを解析し、文字からCIDコードへ逆引きする処理があります。ただし、必要な対応情報がPDF内にない場合や、対象文字がフォントに存在しない場合は、置換候補を作れません。

日本語PDFに特有の事情は、日本語PDF編集で文字化けする原因で詳しく説明しています。

原因3:圧縮されたストリーム

PDFのコンテンツストリームは、FlateDecodeで圧縮されていることがあります。文字列をそのまま検索しても見つからないため、編集するには展開し、内容を確認してから再圧縮する必要があります。

PDF Geckoの実装には、rawデータの検索に加え、単一のFlateDecodeストリームを展開して置換候補を確認する処理があります。複数の候補が見つかる場合は、誤った箇所を変えないために置換を中止します。

原因4:編集制限・暗号化

パスワード、編集制限、暗号化が設定されたPDFでは、ブラウザで開けても編集や保存を期待どおりに行えない場合があります。利用権限のないPDFの制限を回避することは避けてください。

編集が必要な場合は、作成者または管理者に編集可能な元データを確認する方法が確実です。

PDF Geckoが直接置換を検討できる条件

コード上の直接置換候補は、PDFから検出した既存テキストで、文字内容が変更され、複数行ではなく、位置・フォントサイズ・フォントファミリー・太さ・スタイル・色が大きく変わっていない場合に限って検討されます。

文字を移動した場合、書式を変更した場合、改行を含む場合、または元のPDFテキストではない追加文字は、同じコンテンツストリームを書き換える対象にはなりません。

置換候補として扱う文字列形式

実装では、UTF-16BE、BOM付きUTF-16BE、UTF-8、PDF literal string、CID/CMapによる16進表現を候補として扱います。これは、PDFによって文字の保存形式が異なるためです。

候補の長さが元の領域に収まらない場合や、必要な空白コードを安全に補えない場合は、直接置換を行いません。短い文字列への置換でも、同じ表現形式であることが前提です。

現在の保存処理は見た目の保証を優先します

現在のPDF Geckoの保存処理では、既存PDFテキストを編集したページは、直接置換を実行する前に見た目を合成して書き出す経路を選びます。これにより、元の文字と編集後の文字が重なって見える状態を避けます。

この経路では、編集済みページを画像として合成してPDFに配置します。そのため、見た目は保ちやすい一方、そのページの既存文字が出力後も選択・コピーできることは保証されません。

重要: 「文字が編集できた」とは、元のPDF内部の文字列が必ず置換されたことを意味しません。保存後のPDFを開き、用途に必要な見た目と文字選択の状態を確認してください。

追記と見た目の修正は別の操作です

PDF Geckoでは、文字の追記、注釈、白塗りによる見た目の修正、ページ操作を行えます。これらは既存文字をPDF内部で完全に置換する機能とは異なります。

元の文字を隠して新しい文字を重ねる方法は、軽微な見た目の修正には役立つ場合があります。ただし、検索・コピー・アクセシビリティ上の文字情報まで更新するものではありません。

保存レポートで確認できる項目

実装にはraw、Flate、CID/CMapの置換候補数や、見た目合成、追記描画の件数を記録するレポートがあります。これらは、どの経路を検討または使用したかを確認するための情報です。

候補が見つからない、圧縮または表現が曖昧、複数の一致があるといった場合は、直接置換を成功として扱いません。保存できたことだけで、元文字情報の保持を判断しないでください。

PDFの種類ごとの目安

PDFの種類既存文字の直接置換PDF Geckoでの扱い確認事項
通常のテキストPDF内部構造による編集済み既存テキストは見た目合成で保存選択・コピーとレイアウト
raw文字列を含むPDF候補解析の対象raw表現を確認する処理がある一致箇所が一意か
Flate圧縮PDF候補解析の対象展開・再圧縮の処理がある圧縮後に収まるか
CID/CMapのPDF対応情報によるToUnicode CMapを解析する処理がある必要文字が逆引きできるか
スキャンPDF難しい既存文字のOCR編集は非対応元データまたはOCRの利用
暗号化・制限付きPDF制限される場合がある動作を保証しない編集権限

編集前後に行う確認

作業前に元のPDFをコピーし、まず少量の変更で保存結果を確認してください。特に日付、金額、氏名、契約条項、ページ番号は、元のPDFと見比べることをおすすめします。

文字位置やフォントが変わった場合は、PDF編集で文字位置やフォントがずれる理由も確認してください。文字の追加方法は、PDF内のテキストを無料で編集する方法で案内しています。