DWG to svg,我想在转svg的时候携带一些属性,我该如何操作?

使用Aspose for Java将DWG to svg,我想在转svg的时候携带一些自定义属性到svg的path、text元素中,我该如何操作?

@qsczs

简要结论:如果 Aspose.CAD for Java 没有提供在导出 SVG 时直接向 <path><text> 等元素写入自定义属性的 API(目前的文档和提供的资料中未提及此功能),可以在生成 SVG 后对其进行二次处理,手动添加所需属性。

下面给出一种常用的实现思路,供参考:

步骤 操作说明
:one: 使用 Aspose.CAD 将 DWG 导出为 SVG
java<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>
:two: 解析 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>
:three: 遍历需要添加属性的节点(例如所有 <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>
:four: 将修改后的 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>
:five: **(可选)**如果属性来源于 DWG 本身(如块属性、图层名等),可在第 1 步读取相应信息(CadImage.getLayers()CadImage.getBlocks() 等),在第 3 步将这些信息映射为自定义属性后写入。

关键点说明

  1. 目前未在提供的资料中看到 Aspose.CAD 提供“在导出时直接注入自定义 SVG 属性”的开关,因此只能在导出后手动编辑 SVG。
  2. 使用 ByteArrayOutputStream 可以避免先写磁盘、再读取的中间步骤,直接在内存中完成后处理。
  3. 若对性能有严格要求,可在遍历节点时仅处理需要的子集(例如通过 XPath 过滤特定 idclasslayer),以减少不必要的遍历。

如果您有更具体的场景(例如需要保留块属性、图层信息等),请提供详细信息,以便进一步探讨相应的后处理方案。

可是导出的svg没有任何标识字段我可以找到对应的图元,从而重新将对应的图元信息写入到svg中

@qsczs

结论:Aspose.CAD for Java 在导出 SVG 时没有提供直接向 <path><text> 等元素写入自定义属性的 API(目前的文档和示例中未出现此功能)[1]。因此只能在生成 SVG 后进行二次处理,手动把需要的属性添加进去[1]。

下面给出完整的实现思路(基于 Java):

步骤 关键代码
:one: 导出 DWG 为 SVG(内存) 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>
:two: 读取 DWG 中可用的标识信息(可选)
(如图层、块、属性等)
java<br>// 示例:获取图层名称集合<br>List<String> layerNames = cad.getLayers().stream()<br> .map(l -> l.getName())<br> .collect(Collectors.toList());<br>// 其它信息如 cad.getBlocks()、cad.getEntities() 也可在此获取<br>
:three: 解析 SVG 为 DOM 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>
:four: 为目标节点添加自定义属性
(示例:data-layerdata-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>
:five: 将修改后的 DOM 写回 SVG 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>

关键说明

  1. 没有直接的导出开关:截至目前的官方文档和示例中未看到可以在 SvgOptions 中设置“写入自定义属性”的选项[1]。
  2. 后处理是唯一可行方案:利用标准 XML 解析(DOM、XPath、SAX 等)遍历生成的 SVG,使用 Element.setAttribute 添加任意属性即可。
  3. 属性来源:如果需要把 DWG 本身的元数据(图层名、块属性、实体 ID 等)写入 SVG,只需在第 1 步保存 CadImage 对象后,调用相应的 getter(如 getLayers()getBlocks())获取信息,然后在第 4 步映射为自定义属性[1]。
  4. 性能提示:使用 ByteArrayOutputStream 直接在内存中完成导出和后处理,避免磁盘 I/O;若只关心特定元素,可通过 XPath 过滤或在遍历时加入条件判断,减少不必要的遍历。

如有更具体的映射需求(例如把每个块的属性写入对应的 <g>),请提供对应的 DWG 元数据结构示例,我们可以进一步细化第 4 步的映射逻辑。

以上步骤即可在导出的 SVG 中加入任意自定义属性,以便后续业务识别和处理。若在实现过程中遇到异常或需要进一步的示例代码,请在本帖继续交流。

@qsczs,
您好,
我们尚未实现此功能,我们已创建 CADJAVA-12057 来实现此功能。