Как конвертировать SVG в PNG на лету - PullRequest
14 голосов
/ 17 ноября 2011

Я пытаюсь конвертировать SVG в PNG. документ svg приходит с сервера как Inputstream.

Сначала я конвертирую поток svg в байтовый массив с помощью:

 byte[] streamBytes = IOUtils.toByteArray(svgStream);

Затем я конвертирую байты в OutputStream (PNG) со следующим кодом.

private ByteArrayOutputStream svgToPng(byte[] streamBytes)
                                            throws TranscoderException, IOException {
        PNGTranscoder t = new PNGTranscoder();
        TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(streamBytes));
        ByteArrayOutputStream ostream = new ByteArrayOutputStream();
        TranscoderOutput output = new TranscoderOutput(ostream);

        t.transcode(input, output);

        ostream.flush();
        // ostream.close();
        return ostream;
    }

Но я получаю исключение нулевого указателя на "t.transcode(input, output);"

org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
Premature end of file.
graphdata : null
    at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:136)
    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)

Примечание: если я сохраню svgstream на диске и использую следующий транскодер с входом в конструктор uri, тогда он будет работать Но в моем случае я не хочу экономить на диске.

TranscoderInput input = new TranscoderInput(new File("c:/a.svg").toURI().toString());

1 Ответ

4 голосов
/ 18 ноября 2011

Я нашел проблему.

Я проверял каждый раз, если svgstream в порядке или нет. Чтобы проверить, все ли в порядке, я каждый раз создавал файл SVG с кодом в своем комментарии. По логике это потребляло поток. В конце не было никакого реального потока. Это вызвало исключение. Спасибо всем ..

...