Отобразить viewBox как новый SVGDocument программно - PullRequest
0 голосов
/ 28 июня 2019

У меня есть SVGDocument, который я программно получил как byte[] из соединения с базой данных. Элемент <svg> содержит правильный атрибут viewBox, который покрывает часть SVGDocument, которую существующий процесс должен отобразить как PDF.

Используя следующий (простой) код, я смог проверить правильность установки свойств viewBox:

Element rootElement = svgDocument.getRootElement();
String viewBox = rootElement.getAttribute("viewBox");
log.debug("viewBox={}", viewBox);
// viewBox=-612 0 1224 792

Моя цель - использовать метод Batik getEnclosureList() для получения NodeList и построения нового (обрезанного) SVGDocument, который я могу отправить в устаревший процесс, который будет отображать PDF.

Код, который я пытался использовать, указан ниже:

SVGRect rectangle = svgDocument.getRootElement().createSVGRect();
rectangle.setX(minX);  // -612
rectangle.setY(minY); // 0
rectangle.setWidth(startingX); // 1224
rectangle.setHeight(startingY); // 792

NodeList croppedNodes = svgDocument.getRootElement().getEnclosureList(rectangle, null);

Моя проблема в том, что SVGSVGContext является нулевым, когда я использую этот подход.

Мои попытки найти способ установки SVGSVGContext не увенчались успехом, поэтому я решил опубликовать свою проблему здесь.

Я не продаюсь при использовании Apache Batik для этого решения, но похоже, что метод getEnclosureList() может вернуть именно то, что мне нужно для завершения моей задачи.

1 Ответ

0 голосов
/ 29 июня 2019

Откопав много исходного кода, я думаю Я нашел ответ на вопрос, что мне нужно сделать, что подробно описано в методе initSvgDom():

private void someMethod(SVGDocument svgDocument) {
   initSvgDom(svg);

   Element rootElement = svg.getRootElement();

   String viewBox = rootElement.getAttribute("viewBox");
   log.debug("viewBox={}", viewBox);

   String[] viewBoxArray = viewBox.split(" ");

   float minX = Float.valueOf(viewBoxArray[0]);
   float minY = Float.valueOf(viewBoxArray[1]);
   float startingX = Float.valueOf(viewBoxArray[2]);
   float startingY = Float.valueOf(viewBoxArray[3]);

   SVGRect rectangle = svgDocument.getRootElement().createSVGRect();
   rectangle.setX(minX);
   rectangle.setY(minY);
   rectangle.setWidth(startingX);
   rectangle.setHeight(startingY);

   NodeList nodes = svgDocument.getRootElement().getEnclosureList(rectangle, null);

   // nodes contains a list of elements within the specified rectangle, which matches the value of the viewBox within the svgDocument.
  ... do stuff with nodes
}

private void initSvgDom(Document document) {
   UserAgent userAgent = new UserAgentAdapter();
   DocumentLoader loader = new DocumentLoader(userAgent);
   BridgeContext bridgeContext = new BridgeContext(userAgent, loader);
   bridgeContext.setDynamicState(BridgeContext.DYNAMIC);

   (new GVTBuilder()).build(bridgeContext, document);
}


...