使用Batik的SVGGraphics2D时,如何设置字体系列而不是字体?

时间:2016-03-08 14:38:07

标签: java batik

我目前使用Batik的SVGGraphics2D获得以下代码:

...
final SVGGraphics2D svgGraphics2D = new SVGGraphics2D(svgGeneratorContext, false);
svgGraphics2D.setSVGCanvasSize(new Dimension(width, height));
svgGraphics2D.setFont(font);
...

因此,如果font是执行代码的系统上的可用Font,则会将正确的属性添加到生成的SVG文件中。

但是,如果缺少字体(例如Linux盒子上的“Verdana”),则使用默认字体(添加font-family:'Dialog')。

因此,我想传递一个font-family,而不是指定一个字体,以便在生成的SVG中有font-family="DejaVu Sans,Verdana,Geneva,sans-serif"。我怎么能实现这一点,如果我没有错,API只接受Font个参数?

我希望有一种比使用xslt转换xml输出更简单的方法。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果你有一个(许可的)字体文件,比如资源,你可以这样做:

transaction_type = 'ILAU'

这是使用自己的字体提供应用程序的一般方法。

然后在SVG中,您可以为独立的svg文件嵌入确切的字体。

我想知道不可能这样做:

    InputStream is = SomeClass.getResourceAsStream("/fonts/DejaVu Sans.ttf");
    Font font = Font.createFont(Font.TRUETYPE_FONT, is);
    GraphicsEnvironment.getLocalGraphicsEnvironment();
    ge.registerFont(font);

因为这将是CSS方式。

答案 1 :(得分:0)

鉴于widthheight和Swing组件(label),以下代码将导出设置了viewBoxfont-family属性的SVG文档在根svg元素上:

final var dom = getDOMImplementation();
final var ns = "http://www.w3.org/2000/svg";
final var doc = dom.createDocument( ns, "svg", null );
final var context = createDefault( doc );
context.setPrecision( 5 );

final var generator = new SVGGraphics2D( context, false );
generator.setSVGCanvasSize( new Dimension( width, height ) );
label.paintComponent( generator );

Element root = generator.getRoot();
final String viewBox = format( "0 0 %d %d", width, height );
root.setAttribute( SVG_VIEW_BOX_ATTRIBUTE, viewBox );
root.setAttribute( "font-family", "Arial" );

try( final var out = new OutputStreamWriter(
    new FileOutputStream( "/tmp/saved.svg" ), UTF_8 ) ) {
  generator.stream( root, out );
}

产生:

<svg
  stroke-dasharray="none"
  shape-rendering="auto"
  xmlns="http://www.w3.org/2000/svg"
  font-family="Arial"
  width="305"
  text-rendering="auto"
  fill-opacity="1"
  contentScriptType="text/ecmascript"
  color-interpolation="auto"
  color-rendering="auto"
  preserveAspectRatio="xMidYMid meet"
  font-size="12px"
  viewBox="0 0 3 3"
  fill="black"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  stroke="black"
  image-rendering="auto"
  stroke-miterlimit="10"
  zoomAndPan="magnify"
  version="1.0"
  stroke-linecap="square"
  stroke-linejoin="miter"
  contentStyleType="text/css"
  font-style="normal"
  height="311"
  stroke-width="1"
  stroke-dashoffset="0"
  font-weight="normal"
  stroke-opacity="1">