我想要使用Java解析SVG图像并处理其中的路径,以进行自定义转换。在Java中,最简单的方法是什么,可以仅提取路径数据?我查看了apache xmlgraphics/batik包,但不太清楚如何返回路径类型和参数。有什么建议吗?
要提取path
数据,您可以使用XPath。
假设您有这个SVG,并且想提取所有path
数据(来自两个path
元素):
<svg>
<rect x="1" y="1" width="1198" height="598"
fill="none" stroke="blue" stroke-width="1" />
<path d="M200,300 Q400,50 600,300 T1000,300"
fill="none" stroke="red" stroke-width="5" />
<g fill="black" >
<circle cx="200" cy="300" r="10"/>
<circle cx="600" cy="300" r="10"/>
<circle cx="1000" cy="300" r="10"/>
</g>
<g fill="#888888" >
<circle cx="400" cy="50" r="10"/>
<circle cx="800" cy="550" r="10"/>
</g>
<path d="M200,300 L400,50 L600,300 L800,550 L1000,300"
fill="none" stroke="#888888" stroke-width="2" />
</svg>
首先,您需要将XML文件加载为文档:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("image.svg");
然后您可以使用XPath选择所需的节点。以下表达式选择文件中所有path
元素中d
属性的内容:
String xpathExpression = "//path/@d";
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
XPathExpression expression = xpath.compile(xpathExpression);
由于预期结果是一个节点集(两个字符串),我们使用XPathConstants.NODESET
作为第二个参数,在SVG文档上评估表达式:
NodeList svgPaths = (NodeList)expression.evaluate(document, XPathConstants.NODESET);
从那里,您可以使用以下方法提取第一组路径数据:
svgPaths.item(0).getNodeValue();
PathParser
。从那里,您可以将值应用于Batik API、java.awt.geom中的GeneralPath
和来自Batik的ExtendedGeneralPath,使您能够重新创建路径并进行修改。 - helderdarocha