バティックのことを聞いて、とても人気があることは知っていますが、使ったことがありません。以前は、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で形状を記述するための一般的な要素)である場合、その位置に注意します(cx、cy ;修飾子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();
}
}
}