2011/07/25

iText の iTextAsian.jar にフォントを追加する

Java の iText の iTextAsian.jar にフォントを追加するこころみ。本当にやりたいことは MS ゴシック等をうめこまずに使うこと。

iTextAsian.jar の中を見てみると、フォント毎のメトリクス情報が書かれたプロパティファイル、 cjkfonts.properties というフォント名とそのエンコーディングを書いたファイルが必要になることがわかる。

cjkfonts.properties の方は他の行をコピーすればよい。自分のソースディレクトリに com.lowagie.text.pdf.fonts パッケージを作成し、 cjkfonts.properties をコピーして、一番下に TakaoPGothic を足した。

# Supported CJK fonts and encodings
HeiseiMin-W3=Adobe-Japan1-UCS2_UniJIS-UCS2-H_UniJIS-UCS2-V_UniJIS-UCS2-HW-H_UniJIS-UCS2-HW-V_
HeiseiKakuGo-W5=Adobe-Japan1-UCS2_UniJIS-UCS2-H_UniJIS-UCS2-V_UniJIS-UCS2-HW-H_UniJIS-UCS2-HW-V_
KozMinPro-Regular=Adobe-Japan1-UCS2_UniJIS-UCS2-H_UniJIS-UCS2-V_UniJIS-UCS2-HW-H_UniJIS-UCS2-HW-V_

STSong-Light=Adobe-GB1-UCS2_UniGB-UCS2-H_UniGB-UCS2-V_
STSongStd-Light=Adobe-GB1-UCS2_UniGB-UCS2-H_UniGB-UCS2-V_

MHei-Medium=Adobe-CNS1-UCS2_UniCNS-UCS2-H_UniCNS-UCS2-V_
MSung-Light=Adobe-CNS1-UCS2_UniCNS-UCS2-H_UniCNS-UCS2-V_
MSungStd-Light=Adobe-CNS1-UCS2_UniCNS-UCS2-H_UniCNS-UCS2-V_

HYGoThic-Medium=Adobe-Korea1-UCS2_UniKS-UCS2-H_UniKS-UCS2-V_
HYSMyeongJo-Medium=Adobe-Korea1-UCS2_UniKS-UCS2-H_UniKS-UCS2-V_
HYSMyeongJoStd-Medium=Adobe-Korea1-UCS2_UniKS-UCS2-H_UniKS-UCS2-V_

TakaoPGothic=Adobe-Japan1-UCS2_UniJIS-UCS2-H_UniJIS-UCS2-V_UniJIS-UCS2-HW-H_UniJIS-UCS2-HW-V_

問題はフォント毎のメトリクス情報が書かれたプロパティファイルの方。いろいろもがいて com.lowagie.text.pdf.TrueTypeFontUnicode を使って作成することにした。次のようなような感じ。

package com.lowagie.text.pdf;

import java.io.IOException;
import java.io.PrintStream;

import com.lowagie.text.DocumentException;

public class FontMetrics extends TrueTypeFontUnicode {

public static void main(String[] args) throws Exception {
// 使いたいフォント。ttc の場合は foo.ttc,0 のようにインデックス指定する。
String fontPath = "/usr/share/fonts/truetype/ttf-japanese-gothic.ttf";
FontMetrics fm = new FontMetrics(fontPath);
// プロパティファイルの出力先
String dir = "/home/ancient/letter/java/eclipse-workspace/itext/src/com/lowagie/text/pdf/fonts/";
PrintStream out = new PrintStream(dir + fm.getPostscriptFontName()
+ ".properties");
fm.dump(out);
out.close();
}

public FontMetrics(String ttFile) throws DocumentException, IOException {
super(ttFile, "Identity-H", true, null, true);
}

public void dump(PrintStream out) throws DocumentException {
CJKFont cjkFont = new CJKFont("HeiseiKakuGo-W5", "UniJIS-UCS2-HW-H",
false);
System.out.println(getPostscriptFontName() + ".properties");

out.println("Flags=" + getFlags());
out.println("FontBBox=[" + getFontDescriptor(BBOXLLX) + " "
+ getFontDescriptor(BBOXLLY) + " " + getFontDescriptor(BBOXURX)
+ " " + getFontDescriptor(BBOXURY) + "]");
out.println("ItalicAngle=" + getFontDescriptor(ITALICANGLE));
out.println("Ascent=" + getFontDescriptor(ASCENT));
out.println("Descent=" + getFontDescriptor(DESCENT));
out.println("CapHeight=" + getFontDescriptor(CAPHEIGHT));
out.println("StemV=80");
out.println("Registry=Adobe");
out.println("Ordering=Japan1");
out.println("Supplement=4");

out.print("W=");
for (int i = 0; i < 0xffff; ++i) {
int width = getWidth(i);
int cid = cjkFont.getCidCode(i);
if (width != 0 && width != 1000) {
out.print("" + cid + " " + width + " ");
}
}
out.println();
out.println("W2=");
}

public int getFontDescriptor(int key) {
return (int) getFontDescriptor(key, 1000);
}

public int getFlags() {
int flags = 0;
if (isFixedPitch)
flags |= 1;
flags |= fontSpecific ? 4 : 32;
if ((head.macStyle & 2) != 0)
flags |= 64;
if ((head.macStyle & 1) != 0)
flags |= 262144;
return flags;
}
}

これで、次のように使えるようになったと思う。

Font font = new Font(BaseFont.createFont("TakaoPGothic",
"UniJIS-UCS2-HW-H", BaseFont.NOT_EMBEDDED), 9, Font.NORMAL);

0 件のコメント: