java Batik修改和保存SVG会导致XML格式不正确
我试图编辑一个现有的SVG,然后用Batik保存它(我需要不同的格式和DOM操作)
我所做的:
- Adobe Illustrator源文件(CS 4.0)保存为SVG 1.0,包含所有字形(两种嵌入式字体)
- 装满蜡染(使用SAXSVGDocumentFactory,来源如下)
- DOM修改(即使没有修改也会出现问题)
- 使用SVGTransconder保存
转换代码后,我得到了一个新的SVG文件,其中填充了XML,但无法在Firefox或Illustrator中正确呈现
在Firefox中,我得到的信息是XML格式不正确,例如
<glyph horiz-adv-x="249" unicode=""/>
我的代码:
///////////////
// Load Template File (with embedded Fonts)
///////////////
File file = new File(SVGFilePath);
FileInputStream svgInputStream = new FileInputStream(file);
////////////////////
// Load SVG into DOM-Tree
////////////////////
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
Document doc = factory.createDocument(parser, svgInputStream);
//...
///////////////////////
// Generate Output File
///////////////////////
String savepath = "test.svg";
byte[] fileData = transcodeToSVG(doc);
FileOutputStream fileSave = new FileOutputStream(savepath);
fileSave.write(fileData);
fileSave.close();
我的代码转换:
public byte[] transcodeToSVG(Document doc) throws TranscoderException {
try {
//Determine output type:
SVGTranscoder t = new SVGTranscoder();
//Set transcoder input/output
TranscoderInput input = new TranscoderInput(doc);
ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
OutputStreamWriter ostream = new OutputStreamWriter(bytestream);
TranscoderOutput output = new TranscoderOutput(ostream);
//Perform transcoding
t.transcode(input, output);
ostream.flush();
ostream.close();
return bytestream.toByteArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
# 1 楼答案
David Conrads用Unicode字符提示我找到解决方案:
我丢失了文件的正确编码
换衣服后
到
效果很好