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

我做的事:

  • Adob​​e Illustrator源文件(CS 4.0)已保存为SVG 1.0,带有所有字形(两个嵌入式字体)
  • 加载了蜡染(使用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;
    }
    

    最佳答案

    David Conrads关于Unicode字符的提示使我找到了解决方案:

    我缺少文件的正确编码。

    变更后

    OutputStreamWriter ostream = new OutputStreamWriter(bytestream);
    


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

    它运作良好。

    07-27 21:33