iTextSharpメモ2

PDFの内部構造を調べていくと、深みにはまって窒息しそうになりつつも、なんとか日本語読み取りまで辿り着いたメモ。

そもそもの困難の元は、PDF内部において文章部分が文字コードそのもので書かれているのではなく、CIDとかいうフォントコード(?)に変換されてること。文字コードからCIDへの変換はCMAPというファイルに記述されているらしく、確かにAcrobatのサブフォルダにCMapというフォルダあってファイルがずらり。フォントコードが直接書いてあるから表示には楽なんだろうけど、内容を読み取るにはCIDから文字コードに戻さないといけない、と。CMAPがあるんだから簡単かと思ったものの、ほとんどのCMAPは「文字コード→CID」で記述されていて逆変換はあまり考慮されていない様子。その逆変換を自前でなんてムリムリ…、と怠惰精神でさらに調べていくと、iTextSharpにはiTextAsianというパッケージがあって(allには含まれていなくてextrasにある)、ver2.1からはCMAPも内包しているようなのでこれを使えば何とかなるんでは?、ということで調べ/試しまくって何とかなった! 以下、手順はVisualStudio2013とiTextAsian-all-2.1.zipを使ってのお話。

必要な手順は
1.iTextAsian自体の再構築
オリジナルのiTextAsian.dllは何が悪いのか、リソースに追加しても動作しないので新しく作り直します。iTextAsian-src-2.1.zipを解凍して出てくるiTextAsian.csprojをVS2013で読み込むと自動でプロジェクト変換してくれるので、そのままビルドすればOK。
2.AddToResourceSearchでiTextAsian.dllをリソースに追加
新しく作ったdll、上ではあっさり「リソースに追加」と書きましたが、単純にソリューションの参照に追加しても動作しません。参照に追加した上で、ソースコードからもAddToResourceSearchメソッドで追加する必要があります。なおこのAddToResourceSearchというメソッド、本家iTextではiTextSharp.text.pdf.BaseFontクラスにありますが、iTextSharpではぜんぜん違うところ、iTextSharp.text.io.StreamUtilにあります。読み込みは1回やればいいので、フォームのコンストラクタに
  iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsian.dll");
の1行を書き加えればOK。

こうして作ったアプリで前回読み込めなかったこのファイルを読み込むと

pdftextext03

 

となって日本語取り出し成功です!。

iTextSharpメモ2」への1件のフィードバック

  1. ふーまま

    どつぼにはまってたのでとっても助かりました!
    ありがとうございます^v^

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です