English | Japanese
本パッチは、http://xml.apache.org/fop が提供している FOP-0.16.0 で日本語 ( Type0 フォント ) を表示可能にするためのパッチです。本パッチにより、以下のファミリフォント名が使用可能となります。
本パッチは、以下の環境でコンパイルと PDF 作成の動作確認をしております。
注意:本パッチは、国際化対応版 JDK でなければ、正しく実行する事ができないかもしれません。また、日本語フォント表示可能なマシン環境でなければ、本パッチで生成された PDF ファイルを正しく表示できないかもしれません。
注意:本パッチは、日本語フォントしか提供していませんが、韓国語、中国語への拡張も容易に出来るはずです。もし、本パッチが提供している以外のフォントを使用したい場合、fop-0_16_0/src/codegen/cidfont や fop-0_16_0/src/codegen/cmp 配下に情報を作成し、FontSetup.java と build-jpfop.xml にその情報を追加して下さい。
強制ではありませんが、以下について、jpfop-develop@lists.sourceforge.net へ報告をしていただけると非常に助かります。本メーリングリストの詳細は、http://lists.sourceforge.net/lists/listinfo/jpfop-develop を参照して下さい。
本パッチでは、fop-0.16.0 の以下のクラスを修正しています。
- org.apache.fop.layout.LineArea
- org.apache.fop.pdf.PDFFontDescriptor
- org.apache.fop.pdf.PDFDocument
- org.apache.fop.render.pdf.PDFRenderer
- org.apache.fop.render.pdf.FontSetup
修正したのは addText() メソッドです。日本語は 2 バイト文字なので、範囲は 0 から 65535 です。従来、127 以上の値をとる文字があった場合、自動的に "#" に変換していたので、そのコードをコメントアウトしました。
また、従来、単語ごとに改行の判定を行っていましたが、日本語では単語を半角スペースで区切らないため、正しく改行が行われませんでした。そのため、日本語の場合、1 行に表示できる文字数をオーバーした際に改行するコードを追加しました。
修正したのは toPDF() メソッドです。Rectangle.toPDF() の戻り値は、byte[] なので、既存のコードでは Rectangle に配列を正しく表示していない。これは、おそらく toPDF() メソッドの BUG でしょう。
- 修正前:
p.append("\n/FontBBox "); p.append(fontBBox.toPDF());
- 修正後:
p.append("\n/FontBBox "); p.append(new String(fontBBox.toPDF()));
修正したのは makeFont() メソッドと makeFontDescriptor() メソッドです。
makeFont() メソッド : FontDescriptor が指定されていない際、CIDFont なのか判定し、CIDFont の場合、Type0 フォントと認識するように修正しました。
makeFontDescriptor() メソッド : オプションの属性を提供した OptionalFontDescriptor クラスが引数で渡された場合とそうでない場合の処理を分けました。また、PDFFontDescriptor オブジェクトをインスタンス化する際、ItalicAngle と StemV の位置が逆になっていました。これは、おそらく BUG でしょう。
修正したのは renderInlineArea() メソッドです。Type0 フォント ( CIDFont ) の場合の処理を追加しました。まず、UTF-8 の文字列を CIDFont で指定したエンコーディングで変換します。CIDFontType2 の場合、コードポイントは TrueType なのでそのまま書き出します。
CIDFontType0 の場合、コードポイントは Adobe Type1 なので、CIDFont で指定した CMap に基づいてマッピングを行います。そして、Italic の場合、文字を斜めにします。BOLD の場合、位置をずらしながら 4 回書く処理をします。
修正したのは setup() メソッドです。日本語 Font を追加しました。
本パッチでは、fop-0.16.0 に対して以下のクラスとインタフェイスを新規に追加します。
- org.apache.fop.layout.OptionalFontDescriptor
- org.apache.fop.pdf.PDFCIDFont
- org.apache.fop.pdf.PDFOptionalFontDescriptor
- org.apache.fop.pdf.PDFFontType0
- org.apache.fop.render.pdf.CIDFont
- org.apache.fop.render.pdf.CMap
オプションの属性を提供した FontDescriptor インタフェイスです。FontDescriptor の詳細については、PDF1.3 Reference Manual [1] 7.11 Font descriptors p.222 を参照して下さい。
PDF 中の CIDFont オブジェクトを表すクラスです。CIDFont の詳細については、PDF1.3 Reference Manual [1] 7.8 CIDFonts p.210 や Adobe CMap and CID Font Files Specification Version 1.0 [2] を参照して下さい。
PDF 中の FontDescriptor のオプションの属性を表すクラスです。
PDF 中の Type0 フォントを表すクラスです。Type0 フォントの詳細については、PDF1.3 Reference Manual [1] 7.7.7 Type0 Fonts p.207 を参照して下さい。
CIDFont を表すクラスです。
CIDFont の Width に含まれるエントリを表すクラスです。CIDFont では、
- C [ W1 W2 ... Wn ]
- Cfirst Clast W
の 2 種類のフォーマットがあります。詳細は、PDF1.3 Reference Manual [1] 7.8.3 Character widths in CIDFonts p.213 を参照して下さい。
コードポイントを表すインタフェイスです。指定されたコードポイントを CMap に従ってマッピングします。日本語の Adobe コードポイントについては、Adobe-Japan1-4 Character Collection for CID-Keyed Fonts [3] を参照して下さい。
Width 属性を表すクラスです。
本パッチでは、fop-0.16.0 に対して、codegen を利用して以下のクラスが XML ファイルから自動的に生成されます。
- org.apache.fop.render.pdf.cmap._90ms_RKSJ_H
- org.apache.fop.render.pdf.fonts.jp.GothicBBBMedium
- org.apache.fop.render.pdf.fonts.jp.MSGothic
- org.apache.fop.render.pdf.fonts.jp.MSGothicAlias
- org.apache.fop.render.pdf.fonts.jp.MSGothicBold
- org.apache.fop.render.pdf.fonts.jp.MSGothicBoldAlias
- org.apache.fop.render.pdf.fonts.jp.MSGothicBoldItalic
- org.apache.fop.render.pdf.fonts.jp.MSGothicBoldItalicAlias
- org.apache.fop.render.pdf.fonts.jp.MSGothicItalic
- org.apache.fop.render.pdf.fonts.jp.MSGothicItalicAlias
- org.apache.fop.render.pdf.fonts.jp.MSMincho
- org.apache.fop.render.pdf.fonts.jp.MSMinchoAlias
- org.apache.fop.render.pdf.fonts.jp.MSMinchoBold
- org.apache.fop.render.pdf.fonts.jp.MSMinchoBoldAlias
- org.apache.fop.render.pdf.fonts.jp.MSMinchoBoldItalic
- org.apache.fop.render.pdf.fonts.jp.MSMinchoBoldItalicAlias
- org.apache.fop.render.pdf.fonts.jp.MSMinchoItalic
- org.apache.fop.render.pdf.fonts.jp.MSMinchoItalicAlias
- org.apache.fop.render.pdf.fonts.jp.Osaka
- org.apache.fop.render.pdf.fonts.jp.RyuminLight
本ドキュメントでは、一部を除き、日本語対応における既知の問題のみ書かれています。FOP の問題については、fop-dev@xml.apache.org や fop-cvs@xml.apache.org を参照して下さい。
本パッチでは SVG での日本語表示をサポートしていません。
日本語と日本語以外が含まれる文書で、日本語以外の単語が行の最後で分割される際、ハイフネーションを指定してもハイフネーションその単語がハイフネーションされません。これは、日本語文書ではハイフネーションを使用しないからです。
PDF1.3 Reference Manual [1] 7.7 Fonts p.199 や 7.10.1 ToUnicode CMaps p.219 によると、Type0 フォントでも ToUnicode 属性を用いることにより文字コードを Unicode にマッピング可能となっています。しかし、本パッチではこの機能をサポートしていません。これは、日本語化パッチというよりも FOP の問題かもしれません。
PDF1.3 Reference Manual [1] 7.10 CMaps p.117 によると、PDF 文書内に CMap の情報を埋め込むことができます。しかし、本パッチでは CMap 情報を PDF 文書内に埋め込むことはできません。
PDF1.3 Reference Manual [1] の 7.11 Font descriptors p.223 によると、FontDescriptor で PDF 文書内にフォントを埋め込むことが可能となっています。しかし、本パッチでは日本語フォントを PDF 文書内に埋め込むことはできません。これは、日本語化パッチというよりも FOP の問題かもしれません。
PDF1.3 Reference Manual [1] の 7.7.4 Font Subsets p.204 によると、Font の BaseFont や FontDescriptor の FontName の値の形式は、Postscript 前にユニークな 6 大文字を付けるとなっています。しかし、本パッチではユニークな 6 大文字が付きません。
半角スペースで区切られた複数の単語に下線を引くと、単語毎に下線が途切れてしまします。これは、FOP のバグであり、時期バージョンでは改修されます。詳細は、fop-dev@apache.org を参照して下さい。