svg - batik 无法渲染正确的字体颜色?

标签 svg fonts 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;
    }
}

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

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

Here's a link to my SVG file.

最佳答案

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

style="...;-inkscape-font-specification:'Aharoni, Bold';..."
已知 batik bug阻止呈现以连字符 ( - ) 开头的 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()
    );
  }

关于svg - batik 无法渲染正确的字体颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788030/

相关文章:

javascript - 两条路径之间的 D3js 转换导致解析错误

javascript - 如何在 html5 中使用包含大量单独 svg 的 svg 文件?

java - 我如何将大的 bmp 转换为 png?

css - 使用自定义字体的 rails 和 bootstrap?

css - 加载自定义字体失败

Unity3D,从Unity.UI面板构建PNG吗?

python - 如何在 imsave() (Agg 后端)中设置 PNG 的压缩参数?

html - 如何将 div 标签包裹在 svg 标签内

html - 如何在 SVG 响应式上放置文本?

html - 在 svg 文件中嵌入带有 @font-face 的 base 64 truetype 字体,在 IE 中不起作用