Java Graphics2D绘制文本完全导出到SVG

时间:2016-04-19 16:05:29

标签: java svg

尝试将文本导出到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>

Test Top From SVG; Test Bottom From Graphics2D

enter image description here

如何更改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);
}

这将使用字距调整绘制文本,并允许缩放图形上下文。但是,现在间距(白色空间)有时会在某些字符之间混淆。

enter image description here

enter image description here

0 个答案:

没有答案