Неверные значения ограничивающей рамки для текстового элемента с использованием Batik

102
14

Я пытаюсь нарисовать прямоугольник вокруг текстового элемента, используя getBBox(), код довольно прост, создайте документ, добавьте текстовый элемент, загрузочный документ и добавьте прямоугольник.
Проблема в том, что getBBox возвращает некоторые странные значения, я что-то не хватает?


DOMImplementation impl;
String svgNS;
SVGDocument doc;
Element svgRoot;

UserAgent userAgent;
DocumentLoader loader;
BridgeContext ctx;
GVTBuilder builder;
GraphicsNode rootGN;

...

// get a DOM and create a document
impl = SVGDOMImplementation.getDOMImplementation();
svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
doc = (SVGDocument)impl.createDocument(svgNS, "svg", null);

// Get (the 'svg' element).
svgRoot = doc.getDocumentElement();

// Set the width and height attributes on the root 'svg' element.
svgRoot.setAttributeNS(svgNS, "width", "400");
svgRoot.setAttributeNS(svgNS, "height", "450");

// Add a text element
Element txtElem = doc.createElementNS(svgNS, "text");
txtElem.setAttributeNS(svgNS, "x", "30");
txtElem.setAttributeNS(svgNS, "y", "50");
txtElem.setAttributeNS(svgNS, "style", "font-family:Arial;font-size:20;stroke:#000000;#fill:#00ff00;");
txtElem.setTextContent("sometext");

svgRoot.appendChild(txtElem);

// boot the document
userAgent = new UserAgentAdapter();
loader = new DocumentLoader(userAgent);
ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
builder = new GVTBuilder();
rootGN = builder.build(ctx, doc);

// add a bounding box to text elements
NodeList nodelist = doc.getElementsByTagName("text");
for (int i=0; i < nodelist.getLength(); i++) {
SVGOMTextElement textElem = (SVGOMTextElement)nodelist.item(i);
SVGRect bbox = textElem.getBBox();

Element rectangle = doc.createElementNS(svgNS, "rect");
rectangle.setAttributeNS(svgNS, "x", new Float(bbox.getX()).toString());
rectangle.setAttributeNS(svgNS, "y", new Float(bbox.getY()).toString());
rectangle.setAttributeNS(svgNS, "width", new Float(bbox.getWidth()).toString());
rectangle.setAttributeNS(svgNS, "height", new Float(bbox.getHeight()).toString());
rectangle.setAttributeNS(svgNS, "fill", "rgba(0,0,0,0)");
rectangle.setAttributeNS(svgNS, "stroke", "#ff0000");
rectangle.setAttributeNS(svgNS, "stroke-width", "1");

svgRoot.appendChild(rectangle);
}


это SVG-документ, который я получаю, поскольку вы можете видеть, что прямоугольник имеет разные значения X и Y (ширина и высота также неверны).


<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" zoomAndPan="magnify" width="400" contentStyleType="text/css" preserveAspectRatio="xMidYMid meet" height="450" version="1.0">
<text x="30" style="font-family:Georgia;font-size:20;stroke:#000000;#fill:#00ff00;" y="50">sometext</text>
<rect x="0.65234375" fill="rgba(0,0,0,0)" width="55.621094" stroke-width="1" stroke="#ff0000" height="8.597656" y="8.425781"/>
</svg>

спросил(а) 2012-08-28T22:33:00+04:00 8 лет, 2 месяца назад
1
Решение
93

Проблема возникает из-за того, что вы должны использовать setAttribute вместо setAttributeNS. Указанные координаты x и y игнорируются, поскольку они не являются атрибутами x и y, которые Batik ожидает в пространстве имен по умолчанию, они, по-видимому, распознаются как другие неизвестные атрибуты. Просто используйте это:

txtElem.setAttribute("x", "30");
txtElem.setAttribute("y", "50");
txtElem.setAttribute("style", "font-family:Arial;font-size:20;stroke:#000000;fill:#00ff00;");

ответил(а) 2012-08-30T07:59:00+04:00 8 лет, 2 месяца назад
91

Попробуйте следующее:


rectangle.setAttributeNS(null,

и оставьте svgNS только в createElementNS.

ответил(а) 2014-05-06T18:19:00+04:00 6 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема