2013-02-11 2 views
1

Добрый день всем;добавление предметов в существующее изображение svg

Я в настоящее время работаю над проектом в Java, пытаюсь создать рабочий стол. Мой вопрос заключается в том, что я использую фреймворк (plantuml) для получения svg-отформатированного графика. Тем не менее, я хочу изменить существующий элемент (или компонент, который мы можем сказать) на выходе svg и отобразить его другим способом (например, добавлением деталей). Я провел некоторое исследование об этом, и я нашел две рамки, которые помогают мне достичь моей цели;

1.) http://xmlgraphics.apache.org/batik/ 2.) http://svgsalamander.java.net/

Вопросы; Есть ли какие-либо другие рамки, которые помогут мне манипулировать существующими svg? который я должен использовать, и как я должен использовать, я как бы потерян. Я не знаю, с чего начать.

Предпосылка: я ничего не могу изменить о plantuml. Так что единственное, что у меня есть .svg отформатированное изображение.

С уважением ...

+0

Смотрите этот SO вопрос: http://stackoverflow.com/questions/6657082/svg-building-library-for-java – cschooley

+0

Я смотрю этот, прежде чем задавать свой вопрос. Хотя, это очень похоже на мой вопрос. Он не упоминает о том, как манипулировать существующим svg-файлом из -another framework. –

ответ

2

Я слышал о батике, и я знаю, что это довольно популярно, но я никогда не использовал его. Раньше мне приходилось генерировать/изменять SVG программно несколько раз в моей программе, либо в Java, Javascript, либо на C++. Я всегда делал это вручную, а это означало:

  • Использование стандартного стандартного org.w3c.doma или другой библиотеки DOM;
  • Использование стандартной стандартной версии org.xml.sax Java или другой библиотеки SAX.

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

Вот небольшой пример использования SAX для Java. Я понял, что я немного ржавый; код, похоже, работает, но очистка с помощью SAX/XML/Java Gurus приветствуется. Он работает с SVG-файлом, созданным с помощью программы редактирования Inkscape, но обсуждаемые здесь концепции применимы к любому документу SVG (или даже вообще к XML). В основном это работает, изменяя поток XML-элементов; он вставляет прогрессивную метку рядом с каждым объектом на чертеже.

SAX основан на событиях; события возникают во время разбора XML. Код обрабатывает 3 различных событий:

  • StartDocument поднят в начале документа XML; мы используем это событие для сброса прогрессивного счетчика.
  • startElement создан в начале элемента XML; если элемент является пути (общий элемент для описания формы в SVG), мы принимаем к сведению его позиции (сх, су; классификатор Sodipodi это прежнее название Inkscape).
  • endElement возведен в конце элемента XML; если элемент - это путь , мы сами поднимаем события, которые приводят к созданию метки.Мы используем элемент SVG текст, чтобы добавить ярлык к документу.

    import java.io.File; 
    import java.io.FileInputStream; 
    
    import javax.xml.transform.Result; 
    import javax.xml.transform.sax.SAXTransformerFactory; 
    import javax.xml.transform.sax.TransformerHandler; 
    import javax.xml.transform.stream.StreamResult; 
    
    import org.xml.sax.Attributes; 
    import org.xml.sax.InputSource; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.XMLFilter; 
    import org.xml.sax.XMLReader; 
    import org.xml.sax.helpers.AttributesImpl; 
    import org.xml.sax.helpers.XMLFilterImpl; 
    import org.xml.sax.helpers.XMLReaderFactory; 
    
    public class SVGMod { 
    
        public static void main(String argv[]) { 
    
        try { 
         SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); 
         TransformerHandler serializer = factory.newTransformerHandler(); 
         Result result = new StreamResult(new File("Output.svg")); 
         serializer.setResult(result); 
    
         XMLReader reader = XMLReaderFactory.createXMLReader(); 
         reader.setFeature("http://xml.org/sax/features/namespaces", true); 
         reader.setFeature("http://xml.org/sax/features/namespace-prefixes", true); 
    
         XMLFilter filter = new XMLFilterImpl() { 
    
          private int x; 
          private int y; 
          private int cnt; 
    
          @Override 
          public void startDocument() throws SAXException { 
           super.startDocument(); 
    
           cnt = 0; 
          } 
    
          @Override 
          public void startElement(String uri, String localName, 
            String qName, Attributes atts) throws SAXException { 
           super.startElement(uri, localName, qName, atts); 
    
           if (qName.equals("path")) { 
            int xIndex = atts.getIndex("sodipodi:cx"); 
            int yIndex = atts.getIndex("sodipodi:cy"); 
    
            if (xIndex != -1 && yIndex != -1) { 
             x = (int)Float.parseFloat(atts.getValue(xIndex)); 
             y = (int)Float.parseFloat(atts.getValue(yIndex)); 
             ++cnt; 
            } 
           } 
          } 
    
          @Override 
          public void endElement(String uri, String localName, 
            String qName) throws SAXException { 
           super.endElement(uri, localName, qName); 
    
           if (qName.equals("path")) { 
            AttributesImpl atts = new AttributesImpl(); 
            atts.addAttribute(uri, "", "x", "CDATA", new Integer(x).toString()); 
            atts.addAttribute(uri, "", "y", "CDATA", new Integer(y).toString()); 
            atts.addAttribute(uri, "", "fill", "CDATA", "red"); 
            super.startElement(uri, "", "text", atts); 
            char[] chars = ("Object #: " + cnt).toCharArray(); 
            super.characters(chars, 0, chars.length); 
            super.endElement(uri, "", "text"); 
           } 
          } 
         }; 
         filter.setContentHandler(serializer); 
         filter.setParent(reader); 
    
         filter.parse(new InputSource(new FileInputStream("Input.svg"))); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        } 
    } 
    
+0

Существует много других способов манипулирования XML (от XSLT до JAXB), но я согласен с основной идеей. – lbalazscs

+0

Я рассмотрел XSLT на мгновение, но я полностью забыл о JAXB. Возможно, что-то вроде JAXB будет лучшим вариантом. – damix911

+0

Спасибо за быстрый ответ. Тем не менее, вещь, которую я не понимаю, не помогают ли эти инструменты нам легко достичь определенных объектов в svg? Должны ли пытаться использовать классический подход, а не использовать эти рамки для этой цели? Как и каждый проект, я страдаю с ограничением времени. –

0

Вы можете пойти на изменение маршрута PlantUML в любом случае. В форуме PlantUML * http://sourceforge.net/apps/phpbb/plantuml/viewforum.php?f=1 вы можете запросить архитектуру плагина, которая позволяет модифицировать svg по линиям PlantUML. Таким образом, ваши изменения будут более «совместимыми» с тем, что делает PlantUML, чем если вы просто сделаете свой собственный подход к модификации.

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