Я пытаюсь создать svg с батиком из элементов из исходного документа. Это работает до тех пор, пока элементы не ссылаются на вещи, определенные в разделе defs (например, градиенты или фильтры). Но когда ссылается на фильтр, я получаю исключение. Я попытался также скопировать раздел defs, но это не помогло.Элемент копирования Batik из одного документа в другой
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();
Последняя строка дает исключение. Любая помощь будет оценена по достоинству.
EDIT:
Если я сохранить целевой SVG после добавления в раздел Defs, а затем загрузить его снова работает. Но я хотел бы избежать этого дополнительного шага.
В какое исключение вы попадаете? –
Вызвано: org.apache.batik.bridge.BridgeException: null: -1 Не удалось найти указанный элемент: «# filter18051» – gerrit
Я думаю, вам также придется клонировать ссылочные элементы. Или исправить ссылки на удаленные ссылки (при условии, что Batik поддерживает удаленные ссылки). –