SVG转EMF

最近遇到了某软件只能导出SVG格式的矢量图的情况,但是SVG格式的图片无法直接导入PPT中,所以需要格式转换。

方法一:在线转换

常见的在线转换网站,如cloudconvert
在这里插入图片描述
优点:便捷、部分免费
缺点:每天免费转换次数有上限、适用于待转换文件较少的情况

方法二:软件转换

这篇文章里,博主推荐了五种SVG转EMF的软件,我尝试了其中两种,即inkscape和xnconvert,就我自己的使用体验来说还是推荐软件inkscape,xnconvert虽然操作界面很简单,但是导出的emf是有损的(我也不太清楚原因),但是inkscape导出的EMF就不会,同时支持命令行批量操作,也是免费的,比较符合我的需求。

1. 直接软件操作
打开inkscape,将svg文件放进去,然后另存为emf格式的文件即可。

2. 直接命令行操作
网上有很多关于利用inkscape进行svg转emf的命令,但是有一些已经不太适用于当前的版本,在这个论坛回答中,我找到了比较新的一条回答:
在这里插入图片描述

如果inkscape的.exe的所在文件夹已经被添加至系统环境变量(可以在安装的时候就选择添加,也可以安装后手动添加),举个例子,假设我需要将example.svg转为example.emf,则有

inkscape "D:\example.svg" --export-filename "D:\example.emf"

(注意双引号)根据个人需要,这里.svg和.emf文件的存放路径可以不一致,转换前后的名字也可以不一致。关于inkscape的其他命令行功能可参考官方说明文档

3.利用命令行批量处理
如果需要处理的文件比较多,也可以用inkscape在命令行中进行批量处理,这里可以结合自己比较习惯的方式,可以用matlab, python,或者直接写个脚本在命令行里面运行。需要注意的是,有时候即便inkscape已经被添加进了环境变量中,但是在批量操作的时候还是无法直接调用,这个时候只需要将上面的"inkscape"改为inkscape的完整路径即可,如“D:\install\Inkscape\bin\inkscape"

matlab调用命令行可参考往期文章:
Matlab调用系统命令行利用Internet Download Manager(IDM)实现批量下载

### 将SVG文件换为EMF格式的方法 #### 方法一:使用第三方库 Aspose.SVGEMF 换逻辑 虽然 Aspose.SVG 提供了将 SVG 换为其他图像格式的功能[^1],但它本身并不支持直接导出为 EMF 格式。然而,可以先通过 Aspose.SVGSVG 换为一种中间格式(如 PNG 或 BMP),然后再利用其他工具或库将其进一步换为 EMF。 以下是实现此方法的一个伪代码示例: ```csharp using System; using Aspose.Svg.Conversion; class SvgToEmfExample { static void Main() { // 加载SVG文档 var svgDoc = new Aspose.Svg.SVGDocument("input.svg"); // 使用ImageSaveOptions设置输出选项并保存为PNG var options = new Aspose.Svg.Converters.ImageSaveOptions(Aspose.Svg.Converters.ImageFormat.Png); Converter.ConvertSvg(svgDoc, options, "output.png"); Console.WriteLine("SVG已成功换为PNG"); // 进一步调用外部工具或API将PNG换为EMF... } } ``` 注意:上述代码仅展示了从 SVG 到 PNG 的换过程。要完成最终的 EMF 输出,可能需要引入额外的支持库或命令行工具来处理后续步骤。 --- #### 方法二:基于 Word/WPS 导入功能间接实现 另一种简单的方式是依赖 Microsoft Word 或 WPS Office 自带的能力来进行换[^2]。具体流程如下: - 打开一个新的 Word 文档; - 复制目标 SVG 图像至剪贴板,并粘贴到该文档中; - 如果发现兼容性问题,则按照说明中的建议采用专门的 `svgemf` 工具执行预处理; - 完成后另存整个文档或者单独提取其中嵌套好的 EMF 数据流作为结果。 这种方法适合于不需要频繁自动化操作的小规模需求场景下应用。 --- #### 方法三:借助 Spire.Doc 实现批量脚本化处理 对于更高级别的定制要求来说,还可以考虑运用商业级组件比如 **Spire.Doc** 来达成目的。尽管其官方例子主要演示的是 DOC 至 SVG 方向上的迁移[^3] ,但实际上反过来也是可行的——即加载含有SVG元素的内容之后再指定渲染参数从而生成所需的Metafile形式。 下面给出一段示范性的源码片段用于参考: ```csharp using Spire.Doc; using Spire.Doc.Documents; using System.Drawing.Imaging; namespace DocToEmfConversionDemo { internal class Program { public static void ConvertSvgInWordToEmf(string wordFilePath, string emfOutputPath) { Document document = new Document(); document.LoadFromFile(wordFilePath); foreach (Section section in document.Sections) { foreach (Paragraph paragraph in section.Paragraphs) { foreach (var item in paragraph.ChildObjects) { if(item is Picture pic && !string.IsNullOrEmpty(pic.Base64String)) { byte[] imageBytes = Convert.FromBase64String(pic.Base64String); using(MemoryStream ms=new MemoryStream(imageBytes)){ Bitmap bmp=(Bitmap)Image.FromStream(ms); Metafile metaFile= new Metafile(emfOutputPath,bmp.GetHdc()); Graphics g=Graphics.FromImage(metaFile); g.DrawImage(bmp,new Rectangle(0,0,bmp.Width,bmp.Height)); g.Dispose(); } } } } } Console.WriteLine($"已完成换:{wordFilePath} -> {emfOutputPath}"); } private static void Main(string[] args) { string inputPath=@"path_to_your_word_file_with_svg.docx"; string outputPath=@"desired_emf_output_path.emf"; ConvertSvgInWordToEmf(inputPath,outputPath); } } } ``` > 注明:以上代码假设输入文档内的图片均是以 Base64 编码存储的形式存在;实际项目里需依据具体情况调整解析策略。 --- ### 总结 综上所述,无论是选用成熟的跨平台框架还是探索本地办公软件特性亦或是深入挖掘特定领域专用SDK的价值所在,都能找到满足不同层次业务诉求的有效解决方案。开发者应当根据自身的技术栈偏好以及具体的性能指标考量做出明智的选择。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值