toUnicode マップが欠落している Unicode PDF ドキュメントがあります。toUnicode マップを持つ同じフォントの別の PDF があります。1 つの PDF から抽出し、それを使用して別の PDF からテキストを抽出できますか?
2 に答える
一般的な答えはノーです。あなたが話している ToUnicode マップは PDF CMap 形式に従い、文字コードを Unicode 値に変換するために使用されます。次の 2 つの潜在的な落とし穴に直面します。
1) フォントはまったく同じではありません。それらの名前は同じかもしれませんが、異なるエンコーディングを持っているか、異なるグリフを含んでいる可能性があります (同じエンコーディングであっても)。その場合、別のフォントから CMap を適用すると、正しくない Unicode 値が得られます。
2) フォントはすべての面で同じかもしれませんが、PDF ファイルでサブセット化されている可能性があり (おそらく)、サブセットが異なる場合があります。確かに、フォントが PDF ファイルに保存される方法が変わらない場合もありますが、最適化された PDF ライターがあり、可能な限りサブセット化されたフォントに凝縮されます。これにより、異なる文字コードが使用され、最終的には異なる文字コードが使用される可能性があります。 ToUnicode マップ。
Unicode マッピング用に、Adobe には特別なリソース /ToUnicode があります。フォント リソースの説明内の PDF ファイルで見つけることができます。のように見えます
<</BaseFont /ONWALI+Sylfaen/DescendantFonts [10 0 R]/Encoding /Identity-H/Subtype /Type0/ToUnicode 11 0 R/Type /Font>>
そして/ToUnicode 11 0 R
、あなたがpdfファイルに持っている必要があるということです. 11 0
リソースIDです
レポートで使用されているのと同じフォントを使用して標準の ToUnicode マッピングを行うために、Acrobat Pro ですべてのアルファベット記号を含むサンプル PDF を作成しました。リソースをテキストとして抽出しました。次のようになります。
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo
<< /Registry (Adobe)
/Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
50 beginbfchar
<0003> <0020>
...and so on...
endbfchar
endcmap CMapName currentdict /CMap defineresource pop end end
通常、ToUnicode リソースは圧縮されているため、上記のようなテキストを取得するには解凍する必要があります。
次に、(Misrosoft Reporting で生成されたレポートから) pdf を取得し、見つかったフォントごとに /ToUnicode リソースを追加するコードを作成しました。Pdf にはポインターを含む外部参照テーブルがあり、テキスト ファイルとして編集することはできません。そのため、いくつかの pdf エンジンを使用する必要があります (私は PDFTron を使用しましたが、itext で十分なはずです)。この後処理コードは、レポートを PDF として保存する必要があるたびに実行されます。実際には、ToUnicode マッピングは Microsoft レポート エンジンによって満たされるはずですが、それはあまりにも良いことです。
それでおしまい。