Подтвердить что ты не робот

Как конвертировать SVG в PNG на лету

Я пытаюсь преобразовать 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 на диске и использую следующую transcoderinput с конструктором uri, тогда он работает. Но в моем случае я не хочу сохранять на диске.

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

Ответ 1

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

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