2016-12-28 4 views
0

Я пытаюсь создать 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, а затем загрузить его снова работает. Но я хотел бы избежать этого дополнительного шага.

+0

В какое исключение вы попадаете? –

+0

Вызвано: org.apache.batik.bridge.BridgeException: null: -1 Не удалось найти указанный элемент: «# filter18051» – gerrit

+0

Я думаю, вам также придется клонировать ссылочные элементы. Или исправить ссылки на удаленные ссылки (при условии, что Batik поддерживает удаленные ссылки). –

ответ

0

Я нашел решение, чтобы избежать дополнительной экономии/нагрузки. Используйте importNode вместо clone/accept для def.

Node defs = target.importNode(source.getElementsByTagName("defs").item(0), true); 
target.getRootElement().appendChild(defs); 
Смежные вопросы