gpt4 book ai didi

java - 使用带有 TextLayout 和 LineBreakMeasurer 的 java2d 用户空间测量

转载 作者:行者123 更新时间:2023-11-29 09:25:10 25 4
gpt4 key购买 nike

我在用户空间 (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("Some text to display", x, y) 时,字体大小显示正确。

有没有人有更好的方法在用户空间坐标中进行文本布局?

最佳答案

在开始时调用 g2d.scale() 应该可以做到(当我这样做时它起作用了,我的代码基于完全相同的 LineBreakMeasurer 示例).

关于java - 使用带有 TextLayout 和 LineBreakMeasurer 的 java2d 用户空间测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com