今週のキャリッジさん

とある銀座の零細システム会社の社員ブログ

GAE&iText5.0.0で日本語フォントを使用する方法

1月 5th, 2010

新年あけましておめでとうございます。今年もどうぞよろしくお願い申し上げます。

早速ですが、タイトルの件。 iTextが年末に2.1.7→5.0.0へ大幅バージョンアップしました。 (と言うより、メジャーバージョンをiText.jarをコンパイルしたJavaのバージョンに合わせたのだろうと思われます。) iText2.1.7以前のバージョンをGAE(Google App Engine)上で使う場合、GAEの制約でjava.awtパッケージを使わないようにするためのパッチを当てる必要がありました。iText5.0.0(以降?)では一部改修され、パッチを当てなくてもGAE上でiTextを使用することができるようになった。とっても素晴らしい!!

※具体的には、com.itextpdf.text.BaseColor、com.itextpdf.text.pdf.ICC_Profile、com.itextpdf.text.pdf.codec.wmf.Pointの3クラスのjava.awtパッケージ依存が無くなっただけ。なので、iTextが標準で持っている、java.awtパッケージに依存しているクラス・メソッドは依然として使用できない。それでも十分ですよ!

そこで、iText.jarをダウンロードして早速試してみる。・・・、が、GAE&iText2.1.7用に作成した自前のクラスが軒並みコンパイルエラーを起こす。原因は、iTextのパッケージが、「com.lowagie」→「com.itextpdf」へ変更されているからだ。おぉぅ。。。

気を取り直して、importパッケージ名を全置換して再度コンパイル・・・、上手くいった。では、ローカルのGAE環境で実行!! あれ? 実行エラーが発生。

Exception in thread "main" com.itextpdf.text.DocumentException: No message found for font.1.with.2.is.not.recognized
 at com.itextpdf.text.pdf.BaseFont.createFont(Unknown Source)
 at com.itextpdf.text.pdf.BaseFont.createFont(Unknown Source)
 at com.itextpdf.text.pdf.BaseFont.createFont(Unknown Source)
 :

あからさまにフォント絡みのエラーですよ。試しに、文字を出力しないコードに組み替えて実行してみると、正常に実行できた。が、文字を出力できないPDF生成って、ほとんど意味ないじゃん・・・。

がっかりな状態になってしまったが、ふとパッケージ名が変更されていることを思い出す。 我らは日本人なので、日本語フォントを使用できるように「iTextAsian.jar」と「iTextAsianCmaps.jar」を使っている。中には、「cmaps」というフォントファイルやプロパティファイルが転がっているだけなのだが、ご丁寧に「com.lowagie.・・・」とパッケージの中に入っている。そこで、このパッケージ名を変えてみることにした。面倒なので、jarコマンドを使用せず、zip解凍/圧縮ソフトを使っています。良い子の皆はちゃんとjarコマンドを使用しましょう。

手順:

・上記のiTextのホームページから、SourceForgeのiText DOWNLOADページへ飛ぶ。

・iText.jar(5.0.0)をダウンロードしてなければ、ダウンロードする。 ・「extrajars>ExtraJars1.0」を辿って、iTextAsian.jarとiTextAsianCmaps.jarをダウンロード。

・iTextAsian.jarとiTextAsianCmaps.jarの拡張子を「.zip」に変更して、その辺の解凍ソフトで解凍。(別のディレクトリでやること。ただし、この機会に1つのjarにしたい場合は、一緒のディレクトリで実行してOKだが、両zipの展開先が1つになるので、以降の手順に注意)

・各々、「com/lowagie」のディレクトリを「com/itextpdf」へ変更。 ・各々のディレクトリを、圧縮ソフトでzip圧縮する。zip内のディレクトリ構成は、元に戻すようにする。(つまり、「com」ディレクトリと「META-INF」ディレクトリがzip内のルートディレクトリに存在するようにする)

・ファイル名を「~.zip」からiTextAsian.jarとiTextAsianCmaps.jarに戻す。

これでできたjarを実行パスに追加して、再度自前クラスを実行!・・・おぉぉ、上手くいきました!! 全部のフォントを試した訳ではないですが、ひとまずこれでOKでしょう。そのうち、正式なjarファイルがアップロードされるでしょうけど、それまでの辛抱(?)です。

十分な動作検証を行っていませんが、「すぐに使いたい!」という方のために、ファイルをアップロードしておきます。ご自由にお使いください。(ただし、各種保証無しです)

・iTextAsian.zip(for iText5.0.0)

・iTextAsianCmaps.zip(for iText5.0.0)

追伸:実際にGAEへアップして実行したところ、com.itextpdf.text.pdf.PdfReaderクラスが使用しているcom.itextpdf.text.pdf.MappedRandomAccessFileクラスが、GAEのホワイトリストに登録されていないjava.nio.MappedByteBufferクラスを使用しているため、動きませんでした。orz パッチ作るか・・・??

ま、iText5.0.0で日本語を使える環境ができたから、とりあえず良しとしよう。

4 Responses to “GAE&iText5.0.0で日本語フォントを使用する方法”

  1. [...] 先週の追伸でお伝えした通り、GAE(Google App Engine)上では単純にPdfReaderクラスを使うことができない。理由も先週お伝えした通り、MappedRandomAccessFileクラスが使用しているjava.nio.MappedByteBuffer [...]

  2. [...] (追伸)iText5の日本語フォントについてはコチラをご参照ください。 0 Comments Filed in Google App Engine, iText   Posted by tomotaka.funabiki [...]

  1. キャリッジさん より:

    少し調べたところ、上記パッチファイルの「core/com/lowagie/text/pdf/RandomAccessFileOrArray.java」のパッチ内容を当ててあげれば、上記追伸の問題は解消しそう。(ソースが変わっているので、そのまま適用できないけど) 来週までにパッチファイルを作ってみる。

  2. s-to より:

    解凍、圧縮は以下のコマンドを利用すれば便利かなあ~
    > jar xvf iTextAsian.jar
    > cd com
    > ren lowagie itextpdf
    > cd ..
    > jar cvf iTextAsian.jar com

Leave a Reply