1

皆さんこんにちは。

現在、Java でデスクトップ ツールを作成しようとするプロジェクトに取り組んでいます。私の質問は、svg 形式のグラフを取得するためにフレームワーク (plantuml) を使用していることです。ただし、svg出力で既存のアイテム(またはコンポーネント)を変更し、別の方法で表示したい(詳細の追加など)。これについていくつかの調査を行ったところ、2 つのフレームワークが目標の達成に役立つことがわかりました。

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

質問; 既存の svg を操作するのに役立つ他のフレームワークはありますか? どれを使えばいいのか、どうやって使えばいいのか迷ってしまいます。正確にどこから始めればよいかわかりません。

前提は次のとおりです。plantuml については何も変更できません。だから私が持っているのは.svg形式の画像だけです。

よろしく...

4

2 に答える 2

2

バティックのことを聞いて、とても人気があることは知っていますが、使ったことがありません。以前は、Java、Javascript、またはC ++のいずれかで、プログラム内でSVGをプログラムで数回生成/変更する必要がありました。私はいつも手でそれをしました、それは意味します:

  • Javaの標準org.w3c.domまたはその他のDOMライブラリを使用する。
  • Javaの標準org.xml.saxまたはその他のSAXライブラリを使用します。

SVGはXMLアプリケーションであるため、上記の2つのような汎用XMLAPIを使用して操作するのは非常に簡単です。基本的に、SVGファイルをロードし、APIの適切なメソッドを呼び出して、要素の追加/削除/変更を開始します。

これは、SAXforJavaを使用した小さな例です。私は少し錆びていることに気づきました。コードは機能しているようですが、SAX / XML /JavaGurusによるクリーンアップは大歓迎です。これは、ベクター編集プログラムであるInkscapeで生成されたSVGファイルで動作しますが、ここで説明する概念は、すべてのSVG(または一般的なXML)ドキュメントに適用されます。基本的には、XML要素のストリームを変更することで機能します。図面内のすべてのオブジェクトの近くにプログレッシブラベルを挿入します。

SAXはイベントベースです。XML解析中にイベントが発生します。このコードは、3つの異なるイベントを処理します。

  • startDocumentは、XMLドキュメントの先頭で発生します。このイベントを使用して、プログレッシブカウンターをリセットします。
  • startElementは、XML要素の先頭で発生します。要素がパス(SVGで形状を記述するための一般的な要素)である場合、その位置に注意します(cxcy ;修飾子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();
        }
      } 
    }
    
于 2013-02-11T18:04:57.953 に答える
0

とにかくPlantUMLルートの変更に行きたいと思うかもしれません。PlantUML フォーラム * http://sourceforge.net/apps/phpbb/plantuml/viewforum.php?f=1では、PlantUML の方針に沿って svg を変更できるプラグイン アーキテクチャを求めることができます。このようにして、変更は、独自の変更アプローチを行う場合よりも、PlantUML が行うこととの「互換性」が高くなります。

于 2013-07-28T08:47:49.603 に答える