使用Aspose for Java将DWG to svg,我想在转svg的时候携带一些自定义属性到svg的path、text元素中,我该如何操作?
简要结论:如果 Aspose.CAD for Java 没有提供在导出 SVG 时直接向 <path>、<text> 等元素写入自定义属性的 API(目前的文档和提供的资料中未提及此功能),可以在生成 SVG 后对其进行二次处理,手动添加所需属性。
下面给出一种常用的实现思路,供参考:
| 步骤 | 操作说明 |
|---|---|
使用 Aspose.CAD 将 DWG 导出为 SVGjava<br>import com.aspose.cad.*;<br>import com.aspose.cad.imageoptions.SvgOptions;<br>import java.io.*;<br><br>CadImage cad = Image.load("input.dwg");<br>ByteArrayOutputStream baos = new ByteArrayOutputStream();<br>SvgOptions svgOpts = new SvgOptions();<br>cad.save(baos, svgOpts);<br>String svgContent = baos.toString("UTF-8");<br>cad.close();<br> |
|
解析 SVG 文本(推荐使用标准的 XML 解析库,如 javax.xml.parsers.DocumentBuilder)java<br>DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<br>DocumentBuilder db = dbf.newDocumentBuilder();<br>InputStream is = new ByteArrayInputStream(svgContent.getBytes(StandardCharsets.UTF_8));<br>Document doc = db.parse(is);<br> |
|
遍历需要添加属性的节点(例如所有 <path>、<text>)并使用 setAttribute 方法写入自定义属性。java<br>NodeList paths = doc.getElementsByTagName("path");<br>for (int i = 0; i < paths.getLength(); i++) {<br> Element e = (Element) paths.item(i);<br> e.setAttribute("data-my-id", "P" + i); // 示例自定义属性<br>}<br>NodeList texts = doc.getElementsByTagName("text");<br>for (int i = 0; i < texts.getLength(); i++) {<br> Element e = (Element) texts.item(i);<br> e.setAttribute("data-comment", "example");<br>}<br> |
|
将修改后的 DOM 写回 SVG 文件java<br>TransformerFactory tf = TransformerFactory.newInstance();<br>Transformer transformer = tf.newTransformer();<br>StringWriter writer = new StringWriter();<br>transformer.transform(new DOMSource(doc), new StreamResult(writer));<br>String finalSvg = writer.toString();<br>// 保存或返回 finalSvg<br> |
|
**(可选)**如果属性来源于 DWG 本身(如块属性、图层名等),可在第 1 步读取相应信息(CadImage.getLayers()、CadImage.getBlocks() 等),在第 3 步将这些信息映射为自定义属性后写入。 |
关键点说明
- 目前未在提供的资料中看到 Aspose.CAD 提供“在导出时直接注入自定义 SVG 属性”的开关,因此只能在导出后手动编辑 SVG。
- 使用
ByteArrayOutputStream可以避免先写磁盘、再读取的中间步骤,直接在内存中完成后处理。 - 若对性能有严格要求,可在遍历节点时仅处理需要的子集(例如通过 XPath 过滤特定
id、class或layer),以减少不必要的遍历。
如果您有更具体的场景(例如需要保留块属性、图层信息等),请提供详细信息,以便进一步探讨相应的后处理方案。
可是导出的svg没有任何标识字段我可以找到对应的图元,从而重新将对应的图元信息写入到svg中
结论:Aspose.CAD for Java 在导出 SVG 时没有提供直接向 <path>、<text> 等元素写入自定义属性的 API(目前的文档和示例中未出现此功能)[1]。因此只能在生成 SVG 后进行二次处理,手动把需要的属性添加进去[1]。
下面给出完整的实现思路(基于 Java):
| 步骤 | 关键代码 |
|---|---|
java<br>import com.aspose.cad.*;<br>import com.aspose.cad.imageoptions.SvgOptions;<br>import java.io.*;<br><br>CadImage cad = (CadImage)Image.load("input.dwg");<br>ByteArrayOutputStream baos = new ByteArrayOutputStream();<br>SvgOptions svgOpts = new SvgOptions();<br>cad.save(baos, svgOpts);<br>String svgContent = baos.toString("UTF-8");<br>cad.close();<br> |
|
(如图层、块、属性等) |
java<br>// 示例:获取图层名称集合<br>List<String> layerNames = cad.getLayers().stream()<br> .map(l -> l.getName())<br> .collect(Collectors.toList());<br>// 其它信息如 cad.getBlocks()、cad.getEntities() 也可在此获取<br> |
java<br>import javax.xml.parsers.*;<br>import org.w3c.dom.*;<br>import java.nio.charset.StandardCharsets;<br><br>DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<br>DocumentBuilder db = dbf.newDocumentBuilder();<br>InputStream is = new ByteArrayInputStream(svgContent.getBytes(StandardCharsets.UTF_8));<br>Document doc = db.parse(is);<br> |
|
(示例: data-layer、data-id) |
java<br>// 为所有 <path> 添加属性<br>NodeList paths = doc.getElementsByTagName("path");<br>for (int i = 0; i < paths.getLength(); i++) {<br> Element e = (Element)paths.item(i);<br> // 这里可以把第 2 步得到的图层名或块属性映射进来<br> e.setAttribute("data-layer", layerNames.isEmpty() ? "default" : layerNames.get(i % layerNames.size()));<br> e.setAttribute("data-my-id", "P" + i);<br>}<br>// 为所有 <text> 添加属性(同理)<br>NodeList texts = doc.getElementsByTagName("text");<br>for (int i = 0; i < texts.getLength(); i++) {<br> Element e = (Element)texts.item(i);<br> e.setAttribute("data-comment", "example");<br>}<br> |
java<br>import javax.xml.transform.*;<br>import javax.xml.transform.dom.DOMSource;<br>import javax.xml.transform.stream.StreamResult;<br>import java.io.StringWriter;<br><br>Transformer tf = TransformerFactory.newInstance().newTransformer();<br>StringWriter writer = new StringWriter();<br>tf.transform(new DOMSource(doc), new StreamResult(writer));<br>String finalSvg = writer.toString();<br>// 保存或直接返回 finalSvg<br> |
关键说明
- 没有直接的导出开关:截至目前的官方文档和示例中未看到可以在
SvgOptions中设置“写入自定义属性”的选项[1]。 - 后处理是唯一可行方案:利用标准 XML 解析(DOM、XPath、SAX 等)遍历生成的 SVG,使用
Element.setAttribute添加任意属性即可。 - 属性来源:如果需要把 DWG 本身的元数据(图层名、块属性、实体 ID 等)写入 SVG,只需在第 1 步保存
CadImage对象后,调用相应的 getter(如getLayers()、getBlocks())获取信息,然后在第 4 步映射为自定义属性[1]。 - 性能提示:使用
ByteArrayOutputStream直接在内存中完成导出和后处理,避免磁盘 I/O;若只关心特定元素,可通过 XPath 过滤或在遍历时加入条件判断,减少不必要的遍历。
如有更具体的映射需求(例如把每个块的属性写入对应的
<g>),请提供对应的 DWG 元数据结构示例,我们可以进一步细化第 4 步的映射逻辑。
以上步骤即可在导出的 SVG 中加入任意自定义属性,以便后续业务识别和处理。若在实现过程中遇到异常或需要进一步的示例代码,请在本帖继续交流。