Aspose cad for java 中文丢失

Aspose cad for java svg转成dxf中中文都被转成了“–”横杠字符,使用的是仿宋字体,请问应该如何正确转换

@zou_yw

解决方案概述

Aspose.CAD for JavaSVG → DXF 时出现中文字符被替换为 “–” 的情况,一般是因为:

  1. DXF 版本不支持 Unicode(如 R12、R13、R14)。
  2. 字体未被正确加载,导致 Aspose 找不到对应的中文字体,使用了默认的占位字符。

下面提供一个完整的 示例代码,帮助您在转换过程中正确保留中文文字。


1. 准备工作

步骤 内容
① 下载中文字体 确保系统中已经有 仿宋(FangSong)的 .ttf 文件,例如 SimFang.ttf
② 将字体文件放置在固定目录 例如 C:\AsposeFonts\(后文将在此目录注册)。
③ 确认 SVG 中的字体名称 <text font-family="FangSong">中文文字</text>(名称要与 .ttf 中的 FontFamily 匹配)。

2. 代码示例

import com.aspose.cad.Image;
import com.aspose.cad.FontSettings;
import com.aspose.cad.imageoptions.DxfOptions;
import com.aspose.cad.imageoptions.DxfVersion;

public class SvgToDxfConverter {
    public static void main(String[] args) throws Exception {
        // ① 加载 SVG 文件
        Image svgImage = Image.load("C:/InputFiles/sample.svg");

        // ② 注册中文字体所在文件夹(递归搜索子文件夹)
        //    这里的路径请改成您实际放置字体的路径
        FontSettings.getInstance().setFontsFolder("C:/AsposeFonts", true);

        // ③ 配置 DXF 保存选项
        DxfOptions dxfOptions = new DxfOptions();

        //    使用支持 Unicode 的 DXF 版本(AutoCAD 2007 及以后均支持)
        dxfOptions.setVersion(DxfVersion.AutoCAD2007);

        //    推荐:将文字保存为 MText,这样可以完整保留 Unicode 文本
        dxfOptions.setExportTextAsMText(true);

        // ④ 执行转换
        svgImage.save("C:/OutputFiles/result.dxf", dxfOptions);

        System.out.println("转换完成!");
    }
}

关键点解释

配置 作用 为什么必须这样
FontSettings.getInstance().setFontsFolder(..., true) 把自定义字体文件夹加入 Aspose 的字体搜索路径。 若字体未被找到,Aspose 会使用默认字体(通常是 Arial),导致中文显示为横杠。
dxfOptions.setVersion(DxfVersion.AutoCAD2007)(或更高) 采用支持 Unicode 的 DXF 版本。 早期 DXF 版本(R12~R14)只能保存 ASCII,中文会被替换。
dxfOptions.setExportTextAsMText(true) 把文字保存为 MText 实体,完整保留 Unicode 文本。 对于复杂文字(多行、样式),MText 能避免字符丢失。

3. 常见错误排查

症状 可能原因 检查/解决方法
中文仍显示为 “–” 使用的 DXF 版本是 R12、R13、R14。 确认 dxfOptions.setVersion(...) 已设置为 AutoCAD2007 及以上。
中文变成方框或乱码 字体路径未正确注册或字体名称不匹配。 - 打开 FontSettings.getInstance().getFontsFolder() 检查路径是否正确。
- 确认 SVG 中 font-family.ttfFontFamily 完全相同(大小写敏感)。
转换后文件体积异常大 使用了默认的文字转几何(文字轮廓化),导致大量多段线。 保持 setExportTextAsMText(true),或在不需要文字保留的场景下改为 setExportTextAsMText(false)

4. 参考文档


5. 小结

  1. 使用支持 Unicode 的 DXF 版本(AutoCAD2007 或更高)。
  2. 注册并使用正确的中文字体(仿宋 .ttf)。
  3. 将文字导出为 MText,确保文本以 Unicode 形式保存在 DXF 中。

按照上述步骤配置后,中文字符将能够在生成的 DXF 文件中完整显示,而不会被替换为横杠。若仍有问题,欢迎提供转换前的 SVG 示例日志信息,我们将进一步协助排查。祝您使用顺利!

@zou_yw,
您好,
请问可以分享一下您的转换代码吗?

try {
// 1. 加载SVG文件
Image image = DxfImage.load(srcFile);

        try {
            // 2. 创建DXF导出选项
            DxfOptions exportOptions = new DxfOptions(); // 关键:使用 DxfOptions
            // 3. (可选) 配置光栅化选项
            CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
            rasterizationOptions.setPageWidth(1200); // 设置输出页面宽度
            rasterizationOptions.setPageHeight(800); // 设置输出页面高度
            exportOptions.setVectorRasterizationOptions(rasterizationOptions);
            exportOptions.setTextAsLines(false);
            // 4. 执行转换并保存为DXF
            image.save(destFile, exportOptions);

            System.out.println("SVG 转换为 DXF 成功!文件已保存至: " + destFile);
        } finally {
            // 5. 释放资源
            if (image != null) {
                image.dispose();
            }
        }
    } catch (Exception e) {
        System.err.println("转换过程中发生错误: " + e.getMessage());
        e.printStackTrace();
    }

前面是转换的代码,请帮忙验证

@zou_yw,
不幸的是,我们无法确认该问题,并创建了 CADJAVA-12033 来调查原因和可能的修复方法。

请问你们有复现到同样的问题吗?是否是由于字体的原因

@zou_yw,
我可以重现,但原因目前尚不清楚,我们需要调查一下。

bb3ba033-48e2-4536-bd1f-cad96fcf664d.png (16.2 KB)

你好,我们发现组件转换只会生成R12版本的dxf,这个不支持中文,请问可以支持输出更高版本的DXF文件吗

@zou_yw,
您好,
我们仅支持 DXF R12。