Batik 没有呈现正确的字体颜色?
Batik not rendering the correct font color?
我正在使用 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;
}
}
在同一个 .svg
文件上使用 AndroidSVG
library 生成具有正确颜色的正确 .png
图像。
另一个注意事项;使用 inkscape
的默认字体(我用来创建矢量图形的程序)可以解决这个问题。使用任何其他字体会导致 Batik 将其颜色更改为黑色。
Inkscape 将自定义 CSS 属性、-inkscape-font-specification
添加到与自定义字体文本关联的 style
属性。以下是摘录:
style="...;-inkscape-font-specification:'Aharoni, Bold';..."
已知的 Batik bug 阻止渲染 CSS 以连字符 (-
) 开头的属性。
一个简单的修复方法是编辑文件,然后删除“-inkscape-font-specification”属性。
或者,您可以使用 Batik 的 API 创建一个新的 CSS 样式解析器,删除有问题的 CSS 样式 class。例如:
/**
* <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()
);
}
已接受的答案非常有帮助地指向 Batik bug 1112,表明“-inkscape-font-specification”未正确解析。错误报告有一个解决方法,可通过 Batik 的 CSS 解析器的 re-implementing 部分工作。为了对此进行扩展并使其在此处可用,这是我的解决方法的简化版本。
首先需要一个 CSS 解析器 class 来覆盖 Batik 中的解析器:
import org.apache.batik.css.parser.ExtendedParser;
import org.apache.batik.css.parser.Parser;
import org.w3c.css.sac.CSSException;
import java.io.IOException;
public class InkscapeCssParser extends Parser {
public void parseStyleDeclaration(String source)
throws CSSException, IOException {
source = source.replaceAll(";-inkscape", ";inkscape");
super.parseStyleDeclaration(source);
}
}
请注意,source
参数是特定 SVG 元素的 CSS 样式,而不是完整的 SVG 源。 parseStyleDeclaration
为每个具有 style
属性的元素调用。
虽然 Batik bug re-implements 中提供的解决方法是 parseStyleDeclaration
的一大块,但我只是简单地进行了字符串替换,以去除“;”之后令人讨厌的“-”。因为这是问题的核心。
要使用它,请在加载文档之前设置 CSS 解析器 class 名称:
JSVGCanvas mSvgCanvas;
XMLResourceDescriptor.setCSSParserClassName(InkscapeCssParser.class.getName());
mSvgCanvas.setURI(svgUrl.toString());
我正在使用 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;
}
}
在同一个 .svg
文件上使用 AndroidSVG
library 生成具有正确颜色的正确 .png
图像。
另一个注意事项;使用 inkscape
的默认字体(我用来创建矢量图形的程序)可以解决这个问题。使用任何其他字体会导致 Batik 将其颜色更改为黑色。
Inkscape 将自定义 CSS 属性、-inkscape-font-specification
添加到与自定义字体文本关联的 style
属性。以下是摘录:
style="...;-inkscape-font-specification:'Aharoni, Bold';..."
已知的 Batik bug 阻止渲染 CSS 以连字符 (-
) 开头的属性。
一个简单的修复方法是编辑文件,然后删除“-inkscape-font-specification”属性。
或者,您可以使用 Batik 的 API 创建一个新的 CSS 样式解析器,删除有问题的 CSS 样式 class。例如:
/**
* <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()
);
}
已接受的答案非常有帮助地指向 Batik bug 1112,表明“-inkscape-font-specification”未正确解析。错误报告有一个解决方法,可通过 Batik 的 CSS 解析器的 re-implementing 部分工作。为了对此进行扩展并使其在此处可用,这是我的解决方法的简化版本。
首先需要一个 CSS 解析器 class 来覆盖 Batik 中的解析器:
import org.apache.batik.css.parser.ExtendedParser;
import org.apache.batik.css.parser.Parser;
import org.w3c.css.sac.CSSException;
import java.io.IOException;
public class InkscapeCssParser extends Parser {
public void parseStyleDeclaration(String source)
throws CSSException, IOException {
source = source.replaceAll(";-inkscape", ";inkscape");
super.parseStyleDeclaration(source);
}
}
请注意,source
参数是特定 SVG 元素的 CSS 样式,而不是完整的 SVG 源。 parseStyleDeclaration
为每个具有 style
属性的元素调用。
虽然 Batik bug re-implements 中提供的解决方法是 parseStyleDeclaration
的一大块,但我只是简单地进行了字符串替换,以去除“;”之后令人讨厌的“-”。因为这是问题的核心。
要使用它,请在加载文档之前设置 CSS 解析器 class 名称:
JSVGCanvas mSvgCanvas;
XMLResourceDescriptor.setCSSParserClassName(InkscapeCssParser.class.getName());
mSvgCanvas.setURI(svgUrl.toString());