Java Graphics2D绘制的文本精确导出到SVG

Java Graphics2D绘制的文本精确导出到SVG,java,svg,Java,Svg,我正在尝试将文本导出到SVG文件,并使其看起来类似于使用java Graphics2D绘制的内容。精度对于我的应用程序至关重要,这意味着Java和SVG中的文本都需要对齐。SVG和Graphics2D文本都有相同的字体(系列、样式、大小),我可以肯定地看到生成的文本是不同的 示例:字符看起来相同,但由于某些原因,“T”和“e”之间的间距不同 黑色-SVG文本 蓝色-Java绘制的文本 使用图形绘制文本的代码2d Graphics2D g2 = (Graphics2D) g; String te

我正在尝试将文本导出到SVG文件,并使其看起来类似于使用java Graphics2D绘制的内容。精度对于我的应用程序至关重要,这意味着Java和SVG中的文本都需要对齐。SVG和Graphics2D文本都有相同的字体(系列、样式、大小),我可以肯定地看到生成的文本是不同的

示例:字符看起来相同,但由于某些原因,“T”和“e”之间的间距不同

黑色-SVG文本

蓝色-Java绘制的文本

使用图形绘制文本的代码2d

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(){
图形2d g2=(图形2d)g;
String text=“测试”;
Font Font=新字体(“Arial”,Font.PLAIN,33);
Map Map=newhashtable();
map.put(texttribute.KERNING,texttribute.KERNING_ON);
font=font.deriveFont(地图);
g、 setFont(字体);
g、 setRenderingHint(RenderingHists.KEY_分数矩阵,RenderingHists.VALUE_分数矩阵开);
g、 绘制(getTextShapeByLine,文本);
}
公共形状getTextShapeByLine(字符串行){
AttributedString attstring=新的AttributedString(行);
attstring.addAttribute(TextAttribute.FONT,getTextFont());
FontRenderContext frc=新FontRenderContext(null、true、true);
TextLayout t=新的TextLayout(attstring.getIterator(),frc);
返回t.getOutline(null);
}
这将使用字距绘制文本,并允许在图形上下文上进行缩放。但是,现在某些字符之间的间距(空白)有时会弄乱


看起来一个渲染器支持紧排,而另一个不支持。我想更改为VALUE_FractalMetrics_OFF可能会有所帮助。分数度量与紧排不同,但在J2SE中这是最接近的。我认为Java渲染禁用紧排(这是默认设置),但它可以打开。我猜它会正确渲染。这里的信息:@Frecklefoot这确实使它看起来更相似。但在我的应用程序中,我需要能够在应用仿射变换的编辑器中放大/缩小,保持字体和文本相同,但在放大时,字符开始越来越近,直到最终会重叠。好吧,我想到了两件事。一件是将字体渲染为位图(图像)并放大。这将保留明显的字体渲染,而不会改变字符之间的距离。我也发现了这一点(如果您觉得我的评论有帮助,请向上投票:)
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);
}