蜡染复制元素从一个文档到另一个文档

时间:2016-12-28 22:27:42

标签: java svg batik

我试图用来自源文档中的元素的蜡染来编写svg。只要元素不参考defs部分中定义的内容(如渐变或过滤器),这就可以工作。但是当引用过滤器时,我得到一个例外。我试图复制defs部分,但这没有帮助。

String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
Document source = factory.createDocument("source", getClass().getResourceAsStream("/artwork/source.svg"));

SVGOMDocument target = (SVGOMDocument) domImpl.createDocument(svgNS, "svg", null);
Node defs = source.getElementsByTagName("defs").item(0).cloneNode(true);
target.adoptNode(defs);
target.getRootElement().appendChild(defs);

BridgeContext ctx = new BridgeContext(new UserAgentAdapter());
GVTBuilder builder = new GVTBuilder();
builder.build(ctx, target);

Element sourceEl = getElementByXPath(source,
        "//*[@id='IMAGES']/*[@id='" + selection.getImageSet() + "']/*[@id='"
                + suit.abbreviation() + value + "-" + selection.getImageSet() + "']");
SVGOMElement complete = (SVGOMElement) sourceEl.cloneNode(true);
target.adoptNode(complete);
target.getDocumentElement().appendChild(complete);

Rectangle2D completeBBox = builder.build(ctx, complete).getSensitiveBounds();

最后一行给出了例外。任何帮助将不胜感激。

编辑:

如果我在添加defs部分之后保存目标svg然后再次重新加载它就可以了。但我想避免这个步骤。

1 个答案:

答案 0 :(得分:0)

我找到了一个避免额外保存/加载的解决方案。使用importNode而不是clone / adopt作为defs。

Node defs = target.importNode(source.getElementsByTagName("defs").item(0), true);
target.getRootElement().appendChild(defs);