java - 使用 Batik 的文本元素的边界框值错误

标签 java svg batik

我正在尝试使用 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>

最佳答案

问题是因为您必须使用 setAttribute 而不是 setAttributeNS。指定的 xy 坐标将被忽略,因为它们不是 Batik 期望的 xy 属性默认命名空间,它们似乎被识别为其他未知属性。只需使用这个:

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

关于java - 使用 Batik 的文本元素的边界框值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166280/

相关文章:

java - JFrame 中的绘画不起作用 (Java)

css - 由于使用样式,svg 中的标记图像在 FireFox 中不可见。怎么修?

java - 如何将多个矩形合并为一个多边形

java - Flying Saucer Batik 和 running footer 不能一起使用?

java - 从 hashmap 列表中消除重复项并计算它们的支持度

java - setMultiChoiceItems 的光标未填充列表

java - Spring Security 过滤器链中的困惑

html - 在子元素上使用 css-filter 影响其父元素

javascript - toString() 在 Firefox 和 IE 之间的工作方式不同

java - 如何使用 Apache Batik 库将 Graphics2D 转换为 SVGGraphics2D?