蜡染无法渲染正确的字体颜色?

MyN*_*ser 3 fonts svg png batik

我正在使用 Apache Batik Java 库将.svg矢量图像文件转换为.png文件。问题是生成图像的字体颜色.png都变黑了。这是我用来进行转换的代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;

public class SVGHelperDesktop extends SVGHelper {
    @Override
    public byte[] convertSvgToPng(String svgXml, float png_width)
            throws SVGConversionException {
        byte[] resultPngBytes = null;

        try {
            ByteArrayInputStream inputSvgBytes = new 
                    ByteArrayInputStream(svgXml.getBytes());
            TranscoderInput input_svg_image = new 
                    TranscoderInput(inputSvgBytes);

            ByteArrayOutputStream outputPngBytes = new ByteArrayOutputStream();
            TranscoderOutput output_png_image = new TranscoderOutput(outputPngBytes);

            PNGTranscoder svgToPngConverter = new PNGTranscoder(); 
            svgToPngConverter.addTranscodingHint(PNGTranscoder.KEY_WIDTH, png_width);
            svgToPngConverter.transcode(input_svg_image, output_png_image);

            resultPngBytes = outputPngBytes.toByteArray();

            outputPngBytes.flush();
            outputPngBytes.close(); 
        } catch (Exception e) {
            throw new SVGConversionException("Error converting SVG to PNG", e);
        }

        return resultPngBytes;
    }
}
Run Code Online (Sandbox Code Playgroud)

在同一文件上使用AndroidSVG库会.svg生成.png具有正确颜色的正确图像。

另一个注意事项;使用inkscape(我用来创建矢量图形的程序)的默认字体解决了这个问题。使用任何其他字体会导致 Batik 将其颜色更改为黑色。

这是我的 SVG 文件的链接。

Pau*_*eau 6

Inkscape-inkscape-font-specificationstyle与自定义字体文本关联的属性添加了自定义 CSS 属性。这是摘录:

style="...;-inkscape-font-specification:'Aharoni, Bold';..."
Run Code Online (Sandbox Code Playgroud)

一个已知的蜡染错误会阻止呈现以连字符 ( -)开头的 CSS 属性。

一个简单的解决方法是编辑文件,然后删除“-inkscape-font-specification”属性。

或者,您可以使用 Batik 的 API 创建一个新的 CSS 样式解析器,以删除有问题的 CSS 样式类。例如:

  /**
   * <a href="https://issues.apache.org/jira/browse/BATIK-1112">Bug fix</a>
   */
  public static final class InkscapeCssParser extends Parser {
    public void parseStyleDeclaration( final String source )
      throws CSSException, IOException {
      super.parseStyleDeclaration(
        source.replaceAll( "-inkscape-font-specification:[^;\"]*;", "" )
      );
    }
  }

  static {
    XMLResourceDescriptor.setCSSParserClassName(
      InkscapeCssParser.class.getName()
    );
  }
Run Code Online (Sandbox Code Playgroud)