有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    David Conrads用Unicode字符提示我找到解决方案:

    我丢失了文件的正确编码

    换衣服后

    OutputStreamWriter ostream = new OutputStreamWriter(bytestream);
    

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

    效果很好