itext 5.3.0 で UniJIS-UCS2-HW-H を指定した場合、欧文文字の幅がおかしい
itext 5.3.0がリリースされていたので試してみたところ、UniJIS-UCS2-HW-Hを指定した場合、欧文文字の幅が広がっていた。
5.1.3で出力した場合
5.3.0で出力した場合
PDF出力に使用したサンプル
5.1.3の場合
5.3.0の場合
BaseFont#getCidCodeの値が異なっている。 itextのCJKFont.java の 170行目あたりを見てみると、 指定したエンコーディングではなく、 「cjk_registry.properties」のXXXXX_Uniの定義にあるエンコーディングを使用するようになっている。
HeiseiKakuGo-W5.properties
CJKFont.javaを改変し、「uniMap」変数に指定したエンコーディングを直接指定すれば、5.1.3と同じように出力できる。
5.1.3で出力した場合
5.3.0で出力した場合
PDF出力に使用したサンプル
Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(filename)); document.open(); BaseFont bfH = BaseFont.createFont("KozMinPro-Regular", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED); Font fontH = new Font(bfH, 20); document.add(new Paragraph(bfH.getPostscriptFontName(), fontH)); document.add(new Paragraph("ABCDEあいうえお", fontH)); document.add(Chunk.NEWLINE); CJKFont bfHW = new CJKFont("KozMinPro-Regular", "UniJIS-UCS2-HW-H", BaseFont.NOT_EMBEDDED); System.out.println("AのCID CODE:" + bfHW.getCidCode('A')); Font fontHW = new Font(bfHW, 20); document.add(new Paragraph(bfHW.getPostscriptFontName(), fontHW)); Paragraph p = new Paragraph("ABCDEあいうえお", fontHW); document.add(p); document.close(); System.out.println("done...." + RESULT);コンソール出力は以下のとおり。
5.1.3の場合
AのCID CODE:264
done....results/a.pdf
done....results/a.pdf
5.3.0の場合
AのCID CODE:34
done....results/b.pdf
done....results/b.pdf
BaseFont#getCidCodeの値が異なっている。 itextのCJKFont.java の 170行目あたりを見てみると、 指定したエンコーディングではなく、 「cjk_registry.properties」のXXXXX_Uniの定義にあるエンコーディングを使用するようになっている。
private void loadCMaps() throws DocumentException { try { fontDesc = allFonts.get(fontName); hMetrics = (IntHashtable)fontDesc.get("W"); vMetrics = (IntHashtable)fontDesc.get("W2"); String registry = (String)fontDesc.get("Registry"); uniMap = ""; for (String name : registryNames.get(registry + "_Uni")) { // <--------------------- Adobe_Japan1_Uni uniMap = name; // <-------------- Adobe_Japan1_Uni=UniJIS-UTF16-H if (name.endsWith("V") && vertical) break; if (!name.endsWith("V") && !vertical) break; } if (cidDirect) { cidUni = CMapCache.getCachedCMapCidUni(uniMap); } else { uniCid = CMapCache.getCachedCMapUniCid(uniMap); cidByte = CMapCache.getCachedCMapCidByte(CMap); } } catch (Exception ex) { throw new DocumentException(ex); } }今回のサンプルロジックを実行した場合、「registryNames」変数は、「cjk_registry.properties」ファイルの、「fontDesc」変数は「HeiseiKakuGo-W5.properties」ファイルの情報を持っている。 それぞれのファイルの内容は以下のようになっている。
HeiseiKakuGo-W5.properties
Flags=4 FontBBox=[-92 -250 1010 922] .... Registry=Adobe_Japan1....cjk_registry.propertie
Adobe_Japan1=78-EUC-H 78-EUC-V ...UniJIS-UCS2-H UniJIS-UCS2-HW-H... ... Adobe_Japan1_Uni=UniJIS-UTF16-H UniJIS-UTF16-V結局のところ、「HeiseiKakuGo-W5」の「Registry」の値である「Adobe_Japan1」+「_Uni」で参照できるエンコーディング「UniJIS-UTF16-H」が「HeiseiKakuGo-W5」を使う場合には使用されてしまっていた。
CJKFont.javaを改変し、「uniMap」変数に指定したエンコーディングを直接指定すれば、5.1.3と同じように出力できる。
コメント
コメントを投稿