2015-09-22 2 views
0

При конвертации из SVG в PNG с Apache Batik я иногда получаю странные ошибки. Например для этого SVG https://www.macstories.net/app/themes/macstories4/images/logo-shape-bw.svg он бросает исключение, но не для этого https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svgSVG to PNG - Batik

Вот мой код:

package com.stackoverflow.batik; 

import java.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import org.apache.batik.transcoder.SVGAbstractTranscoder; 
import org.apache.batik.transcoder.TranscoderException; 
import org.apache.batik.transcoder.TranscoderInput; 
import org.apache.batik.transcoder.TranscoderOutput; 
import org.apache.batik.transcoder.image.PNGTranscoder; 

public class Converter { 

    public static BufferedImage convertSVGToPNG(String url) throws TranscoderException, IOException { 
     ByteArrayOutputStream resultByteStream = new ByteArrayOutputStream(); 

     TranscoderInput transcoderInput = new TranscoderInput(url); 
     TranscoderOutput transcoderOutput = new TranscoderOutput(resultByteStream); 

     PNGTranscoder pngTranscoder = new PNGTranscoder(); 
     pngTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, 256f); 
     pngTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, 256f); 
     pngTranscoder.transcode(transcoderInput, transcoderOutput); 

     resultByteStream.flush(); 

     return ImageIO.read(new ByteArrayInputStream(resultByteStream.toByteArray())); 
    } 

    public static void main(String args[]) throws TranscoderException, IOException { 
     BufferedImage image = convertSVGToPNG("https://www.macstories.net/app/themes/macstories4/images/logo-shape-bw.svg"); 
     assert image.getWidth() == 256; 
     assert image.getHeight() == 256; 
    } 
} 

И это исключение

Exception in thread "main" org.apache.batik.transcoder.TranscoderException: null 
Enclosed Exception: 
The current document is unable to create an element of the requested type (namespace: http://www.w3.org/2000/svg, name: description). 
     at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source) 
     at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source) 
     at com.stackoverflow.batik.Converter.convertSVGToPNG(Converter.java:25) 
     at com.stackoverflow.batik.Converter.main(Converter.java:33) 

Я делаю что-то не так?

ответ

1

У SVG нет описания. Предполагаю, вы хотели написать <desc>which does exist.

Chrome и другие браузеры игнорируют неизвестные теги. Батик тоже должен, но этого не делает. Вы всегда можете заменить тег описания тегом desc, используя преобразование XSLT (или какой-либо другой механизм) до передачи его в Batik.

+0

SVG не мой, он работает с Chrome и другим программным обеспечением. Поэтому я предполагаю, что он также должен работать с Apache Batik. – Ph3n1x

+0

Хорошо, спасибо за разъяснение. И нет никакого намека на Батика, чтобы он игнорировал неизвестные теги? – Ph3n1x

+0

Нет, нет. –

Смежные вопросы