Как конвертировать 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());
Ответы
Ответ 1
Я нашел проблему.
Я проверял каждый раз, если svgstream в порядке или нет. Чтобы убедиться, что все в порядке, я каждый раз создавал SVG файл с кодом в своем комментарии. Логически он потреблял поток. В конце не было реального потока. Это вызвало исключение.
Спасибо всем..