尝试将文本导出到SVG文件并使其看起来与使用java Graphics2D绘制的文本类似。精度对于我的应用程序至关重要,这意味着Java和SVG中的文本都需要排列。 SVG和Graphics2D文本都有相同的字体(系列,样式,大小),我可以肯定地看到生成的文本不同。
示例:似乎字符看起来相同,但由于某种原因,“T”和“e”之间的间距不同。
黑色 - SVG文字
BLUE - Java绘制文本
使用Graphics2D绘制文本的代码。
Graphics2D g2 = (Graphics2D) g;
String text = "Test";
Font font = new Font("Arial", Font.PLAIN, 33);
g.setFont(getTextFont());
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.drawString("Test", 0.f, 0.f);
SVG文字
<text fill="rgb(0,115,198)" font-family="Arial" font-size="33.0">
<tspan dy="0" x="0">Test</tspan>
</text>
如何更改SVG(在Adobe中查看)或Java文本以便它们显示完全相同的内容?
更新
转动字距确实会让它变得更好但不完美。
示例:似乎f A之间的间距不同。但是文本的其余部分排成一行。
代码
public void draw() {
Graphics2D g2 = (Graphics2D) g;
String text = "Test";
Font font = new Font("Arial", Font.PLAIN, 33);
Map<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
map.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
font = font.deriveFont(map);
g.setFont(font);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.draw(getTextShapeByLine(text);
}
public Shape getTextShapeByLine(String line) {
AttributedString attstring = new AttributedString(line);
attstring.addAttribute(TextAttribute.FONT, getTextFont());
FontRenderContext frc = new FontRenderContext(null, true, true);
TextLayout t = new TextLayout(attstring.getIterator(), frc);
return t.getOutline(null);
}
这将使用字距调整绘制文本,并允许缩放图形上下文。但是,现在间距(白色空间)有时会在某些字符之间混淆。