gpt4 book ai didi

java - 将项目添加到现有 svg 图像

转载 作者:行者123 更新时间:2023-11-30 04:30:12 24 4
gpt4 key购买 nike

大家下午好;

我目前正在开发一个 Java 项目,尝试创建一个桌面工具。我的问题是我现在正在使用框架(plantuml)来获取 svg 格式的图形。但是,我想更改 svg 输出中的现有项目(或我们可以说的组件)并以另一种方式显示它(例如添加详细信息)。我对此做了一些研究,发现两个框架可以帮助我实现我的目标;

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

问题;有没有其他框架可以帮助我操作现有的 svg?我应该使用哪一个以及我应该如何使用我有点迷失了。我不知 Prop 体从哪里开始。

假设是:我无法改变 plantuml 的任何内容。所以我唯一拥有的是 .svg 格式的图像。

问候...

最佳答案

我听说过 batik ,我知道它很受欢迎,但我从未使用过它。过去,我必须在程序中以 Java、Javascript 或 C++ 的方式多次生成/更改 SVG。我总是用手做,这意味着:

  • 使用 Java 的标准 org.w3c.dom 或其他一些 DOM 库;
  • 使用 Java 的标准 org.xml.sax 或其他一些 SAX 库。

SVG 是一个 XML 应用程序,因此使用通用 XML API(如上面列出的两个 API)非常容易操作。您基本上加载 SVG 文件并通过调用 API 的适当方法开始添加/删除/更改元素。

这是一个使用 SAX for Java 的小示例。我发现我有点生疏了;代码似乎可以工作,但欢迎 SAX/XML/Java 专家进行清理。它对由 Inkscape(一种 vector 编辑程序)生成的 SVG 文件进行操作,但此处讨论的概念适用于任何 SVG(甚至一般的 XML)文档。基本上它的工作原理是改变 XML 元素流;它会在绘图中的每个对象附近插入一个渐进标签。

SAX 是基于事件的; XML 解析期间引发事件。该代码处理 3 个不同的事件:

  • startDocument 在 XML 文档的开头引发;我们使用此事件来重置渐进计数器。
  • startElement 在 XML 元素的开头引发;如果元素是路径(在SVG中描述形状的常见元素),我们记下它的位置(cxcy;限定符sodipodi 是 Inkscape 的前身名。
  • endElement 在 XML 元素末尾引发;如果元素是路径,我们引发自己的事件导致标签的生成。我们使用 SVG 元素 text 将标签添加到文档中。

    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();
    }
    }
    }

关于java - 将项目添加到现有 svg 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14817972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com