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

问题描述 投票:3回答:1

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

我所做的:

  • Adobe Illustrator源文件(CS 4.0)保存为SVG 1.0,包含所有字形(两个嵌入字体)
  • 用Batik加载(使用SAXSVGDocumentFactory,下面的源代码)
  • DOM修改(即使没有修改也会出现问题)
  • 使用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;
}
java svg batik
1个回答
1
投票

David Conrads暗示Unicode字符引导我解决方案:

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

改变之后

OutputStreamWriter ostream = new OutputStreamWriter(bytestream);

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

它运作良好。

© www.soinside.com 2019 - 2024. All rights reserved.