gpt4 book ai didi

java - 以编程方式将 viewBox 渲染为新的 SVGDocument

转载 作者:行者123 更新时间:2023-12-02 03:45:29 25 4
gpt4 key购买 nike

我有一个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()方法可能会准确地返回我完成任务所需的内容。

最佳答案

通过挖掘大量源代码,我认为我已经找到了我需要做什么的答案,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);
}


关于java - 以编程方式将 viewBox 渲染为新的 SVGDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56810640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com