プログラマメモ2 - programmer no memo2

jasperreports 外字への道 アイデアレベル 2007/11/07

java オープンソースの帳票とかつくれるjasperreportsで、外字を表示でお悩み中

JasperForge - Home

対象のjasperreportsのバージョンは1.2.8でちょっと古いので試しています。
いまいち外字なるものの理解が足りてないので、あやういです。
windows上でのはなしです。

まず、windows xpで、C:\WINDOWS\FontsにEUDC.ttfという外字のためのフォントを作成してあると仮定して、jasperereportsでレンダリングした場合、外字(EUDCをフォントで指定という意味で)は表示されます。

で、ここまではいいのですが、問題は、外字以外のものを表示すると表示されなかったです。
java上だと、混合でうまく表示してくれるときがあります。

で、推測ですが、帳票という性質上あいまいなデザインは許さないと思うのできっちりフォントを指定するとそれを律儀に守ってくれるのだと思います。そこがつらい。

全然ためしていないのですが、解決策として考えたこと

(A)IPAとかで配布されているフォントに外字をプラスして、それを使うようにする(どうだろう?)
(B)jasperreports上でフォントを指定している箇所で、外字なら別のフォントを使うようにする。もしくは、指定されたフォントマップにフォントがない場合、別のフォントを使うようにする。(コードに手を加える、jasperreportsはLGPL!!、さあどうする)
(C)外字と使いたいフォントをファミリーにする(この言い回しが正しいかどうかはわからない...)

実験した結果、(JRViewでのレンダリングを対象)
net.sf.jasperreports.engine.export.TextRenderer
で、renderParagraphとかのメソッドで、外字だったら指定された範囲の文字列のフォントを別で指定したらうまくいきました。

AttributedStringに、属性セットを文字列の部分範囲に追加できるメソッドがあるので、それで追加します。
下記のものを指定するよよいっぽい。


java.awt.font.TextAttribute(size),
net.sf.jasperreports.engine.util.JRTextAttribute(PDF_FONT_NAME),
net.sf.jasperreports.engine.util.JRTextAttribute(PDF_ENCODING),
java.awt.font.TextAttribute(family),
net.sf.jasperreports.engine.util.JRTextAttribute(IS_PDF_EMBEDDED),
java.awt.font.TextAttribute(foreground)

これで、混在できるようです。

で、結論として、表示できないフォントは第二指定フォントでレンダリングとかできたらうれしいのかもしれない。上記の案は的をはずしているかもしれない。


参考
フォント構成ファイル

:

kamega

同じ問題で悩んでここに辿り着きました。 やはり renderParagraph いじるしかないんでしょうか...

ugo.nakawaka

kamegaさん

うーん
できたらコードに手を入れたくないんですけど...
renderParagraphをいじる方法いがいちょっと思いつかないです....

ちなみに、JasperReportsってそんなに悪くないツールですよね?

kamega

そうなんですよね~
itext の要領で JRFrame 作ってそこに JRTextElement 入れてみたりとかいろいろ試してみたんですがダメでしたね...
あんまりやり過ぎると ireport 使わずに jasperreport のみで帳票作る形になっちゃうのもなんだかなと思ってたんですよ。

renderParagraph いじる場合って、
while ループの中で AttributedCharacterIterator 回して、フォントが外字領域だったら外字の、普通のフォントであればそちらを addAttribute でセットするって形になるのでしょうか ?
# 実際に動いてるソースってどこかにあります?

iReport + JasperReport は商用の上には負けますが、真ん中から下には全然勝負になるツールだと思いますよ

ugo.nakawaka

kamegaさん

足早にですが、
実験的なコードでしか試していないのですが、renderParagraphに渡される
lastParagraphTextから、外字領域がある場合、AttributedString tmpText =
new AttributedString(
paragraph,
startIndex,
startIndex + layout.getCharacterCount()
);
tmpTxtにaddAttributesというメソッドがあるので、そこにフォント情報を設定したMapをaddAttributes(map, 変更したい文字位置、文字位置END)をくりかえし設定していくことでできそうです。

ちょっときちんとコードをまとめてみますね。

ugo.nakawaka

kamegaさん

#読んでもらえているかな...

jaspereports(JasperViewerとかで)で外字表示のためのコードを別記事にしてあげました。

方法は、net.sf.jasperreports.engine.export.TextRendererのロジックを変更することで行いました。
フォントファミリにEUDCを加えています。

kamega

すいません、連絡遅れました。
前回のコメントにお返事もらったのを機に実装仕掛ろうと思ったのですが、なかなかできずにおりました...
新しいほうもまだ斜め読みしかできず試せておりませんが、追って検証結果報告させて頂きます。

# すっかり方向違いのLDAP関連で煮詰まってます...

喜歓猫de魚

この記事シリーズを参照して、PDFを作成するときも外字混在で表示することができました。ありがとうございます。

詳細は、下記のリンクを参照してください:
http://ap.atmarkit.co.jp/bbs/core/fjava/21834

ugo.nakawaka

喜歓猫de魚さん
お役に立てたのなら感無量です。

こちらこそありがとうございます!!

hozawa

ご参考までに、
JasperReport
http://sourceforge.jp/projects/oss-ja-jpn/downloads/47596/jasperreports-3.7.2-ja2.zip/

iReport
http://sourceforge.jp/projects/oss-ja-jpn/downloads/47597/iReport-3.7.2-ja2.zip/

ugo.nakawaka

hozawa さん
oss-ja-jpnという活動が!!
すばらしいです。

http://oss-ja-jpn.sourceforge.jp/

ありがとうございます。
>_<!