Batik - 修改和保存SVG会导致XML格式不正确

时间:2014-11-10 16:23:46

标签: java svg batik

我尝试编辑现有的SVG,然后使用Batik保存它(我需要不同的格式和DOM操作)。

我的所作所为:

  • Adob​​e Illustrator源文件(CS 4.0)保存为SVG 1.0,包含所有字形(两个嵌入字体)
  • 加载Batik(使用SAXSVGDocumentFactory,下面的来源)
  • DOM-Modifications(即使没有修改也会出现问题)
  • 使用SVGTranscoder保存

转码后,我得到一个新的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 个答案:

答案 0 :(得分:1)

大卫·康拉德斯用Unicode字符提示我解决方案:

我错过了正确的文件编码。

更改后

OutputStreamWriter ostream = new OutputStreamWriter(bytestream);

OutputStreamWriter ostream = new OutputStreamWriter(bytestream, "UTF-8");

效果很好。