Преобразование SVG, включая внешний CSS, в изображение java

Я хочу преобразовать файл SVG в изображение. Проблема в том, что мой SVG использует внешний файл CSS, и когда я использую Apache Batik , он не может распознать внешний файл CSS и просто показывает стили, встроенные в теги SVG. Вот мой пример кода:

public static void svg2jpgBatik1() {
        JPEGTranscoder transcoder = new JPEGTranscoder();

        try {

            // Create a JPEG transcoder
            JPEGTranscoder t = new JPEGTranscoder();
            // Set the transcoding hints.
            t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY,
                    0.8f);

            // Create the transcoder input.
            String svgURI = new File("D:\\SVG_PATH\\map.svg").toURL().toString();
            TranscoderInput input = new TranscoderInput(svgURI);

            // Create the transcoder output.
            OutputStream ostream = new FileOutputStream("D:\\JPEG_PATH\\map.jpg");
            TranscoderOutput output = new TranscoderOutput(ostream);
            t.addTranscodingHint(JPEGTranscoder.KEY_ALTERNATE_STYLESHEET, "D:\\STYLESHEET_PATH\\style.css");
            t.addTranscodingHint(JPEGTranscoder.KEY_BACKGROUND_COLOR, Color.blue);

            // Save the image.
            t.transcode(input, output);

            // Flush and close the stream.
            ostream.flush();
            ostream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

Эта строка работает:

t.addTranscodingHint(JPEGTranscoder.KEY_BACKGROUND_COLOR, Color.blue);

пока эта строка не работает:

 t.addTranscodingHint(JPEGTranscoder.KEY_ALTERNATE_STYLESHEET, "D:\\STYLESHEET_PATH\\style.css");

в SVG я добавил эту часть:

<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 10 1000" preserveAspectRatio="xMinYMin meet"> 
<defs>
    <link href="STYLESHEET_PATH\\style.css" type="text/css" rel="stylesheet" 
          xmlns="http://www.w3.org/1999/xhtml"/>

  </defs>

Который применил SVG, когда я открываю его в браузере, но в батике он не применяется.

Я также поместил стили в тег в SVG, но результат был таким же.

Единственный стиль, который он может применить, - это встроенный стиль SVG, например fill = "# FFFFFF":

<text text-anchor="middle" alignment-baseline="middle"  x="624" xml:space="preserve" y="123.0" 
       fill="#FFFFFF"  >Sample Text</text>

Мне было интересно, может ли кто-нибудь помочь мне решить эту проблему или сообщить мне какие-либо лучшие альтернативы для использования стилей для SVG из Внешнего CSS, когда я конвертирую его в изображение.

Заранее спасибо.


person FARzad    schedule 31.08.2017    source источник
comment
Спасибо @RobertLongson за подсказку. Я нашел решение.   -  person FARzad    schedule 01.09.2017


Ответы (1)


Я добавил эту строку вверху своего SVG-кода:

<?xml-stylesheet type="text/css" href="style.css" ?>

вместо этой части после тега SVG:

<defs>
    <link href="style.css" type="text/css" rel="stylesheet" 
          xmlns="http://www.w3.org/1999/xhtml"/>

  </defs>

и теперь он создает изображение со стилями из внешнего файла CSS.

Итак, файл SVG будет таким:

<?xml-stylesheet type="text/css" href="style.css" ?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 10 1000" preserveAspectRatio="xMinYMin meet"> 
person FARzad    schedule 01.09.2017