IDカードを印刷するためにユーザースペース(mm)で定義されたjava2dイメージがあります。ピクセルへの変換は、必要なDPI(画面または印刷)にAffineTransformを使用することによって行われます。
テキストを複数行に折り返したいのですが、TextLayoutはユーザースペースの座標を尊重しません。ラップされたテキストをリージョンに書き込むために、以下を使用していました。
private void drawParagraph(Graphics2D g2d, Rectangle2D area, String text) {
LineBreakMeasurer lineMeasurer;
AttributedString string = new AttributedString(text);
AttributedCharacterIterator paragraph = string.getIterator();
int paragraphStart = paragraph.getBeginIndex();
int paragraphEnd = paragraph.getEndIndex();
FontRenderContext frc = g2d.getFontRenderContext();
lineMeasurer = new LineBreakMeasurer(paragraph, frc);
float breakWidth = (float)area.getWidth();
float drawPosY = (float)area.getY();
float drawPosX = (float)area.getX();
lineMeasurer.setPosition(paragraphStart);
while (lineMeasurer.getPosition() < paragraphEnd) {
TextLayout layout = lineMeasurer.nextLayout(breakWidth);
drawPosY += layout.getAscent();
layout.draw(g2d, drawPosX, drawPosY);
drawPosY += layout.getDescent() + layout.getLeading();
}
}
上記のコードは、フォントのユーザースペースサイズを使用してフォントメトリックを決定するため、かなり大きくなります。フォントサイズは、以下のように計算して、領域内の行数に最適な垂直方向のフィットとして計算されます。例えば
attr.put(TextAttribute.SIZE, (geTextArea().getHeight() / noOfLines - LINE_SPACING) );
g2d.drawString( "表示するテキスト"、x、y)を使用すると、フォントサイズが正しく表示されます。
ユーザースペースの調整でテキストレイアウトを行うためのより良い方法を持っている人はいますか?