首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SVG转换为.vsdx MS Visio文件

将SVG转换为.vsdx MS Visio文件
EN

Stack Overflow用户
提问于 2022-06-10 08:33:20
回答 1查看 799关注 0票数 0

我有一个生成SVG图的应用程序,我们希望创建一个导出到Visio选项,理想情况下,这个选项将在幕后(通过服务器端C#)获取一个SVG文件,并将其直接转换为用户可以下载的MS Visio .vsdx文件,然后在Visio中无缝地打开和编辑(而不必下载SVG文件,然后将其导入Visio)。实际上,尝试复制Visio在后端C#中提供的"Open“功能。

我已经看到了很多从Visio到SVG的答案,但事实恰恰相反。

我还知道.vsdx只是一个压缩文件,但是具有这个扩展名。里面有一堆特定于visio的文件和文件夹--如果有人知道这些文件/文件夹及其内容的最低要求是什么,以及SVG适合哪里,也许这是一种方法。

如有任何指导,将不胜感激。

EN

Stack Overflow用户

回答已采纳

发布于 2022-06-15 10:56:39

挖掘这个,信用/来源:https://programmer.group/5c650f3227420.html

SVG可以转换为Visio的vsd格式。这个方法很简单。主要方法是打开SVG文件并将其保存为vsd文件。调用方法如下:

代码语言:javascript
运行
复制
/// <summary>
/// svg turn vsd
/// </summary>
/// <param name="svgFn">svn file name</param>
/// <param name="desVsdFn">Preserved vsd file name</param>
private static void Svg2Vsd(string svgFn, string desVsdFn)
{
    var app = ComObj.Create("Visio.Application");
    app["Visible"] = new ComObj(false);
    var docs = app["Documents"];
    short visOpenHidden = 64, visOpenRO = 2;
    var doc = docs.Call("OpenEx", svgFn, visOpenHidden + visOpenRO);
    doc.Call("SaveAs", desVsdFn);
    doc.Call("Close");

    var win = app["Window"];
    app.Call("Quit");
}

这里我使用了我自己编写的ComObj类。其目的是使通过反射调用Com组件(如Office )变得容易,并使代码在调用时简洁。

为什么使用反射来动态调用而不是直接引用Com组件?其主要目的是减少程序代码对COM组件的依赖和耦合,以便于代码部署的编译和分发。动态调用可以编译并运行,而无需添加组件引用。如果服务器上没有安装Com组件,您还可以提供直观的提示,而不是程序错误。

该类的代码如下:

代码语言:javascript
运行
复制
using System;
using System.Reflection;

namespace HZ.Common
{
    /// <summary>
    /// For convenience Com Object attributes, method calls
    /// </summary>
    public class ComObj
    {
        public static ComObj Create(string progId)
        {
            var type = Type.GetTypeFromProgID(progId);
            if (type == null)
            {
                throw new Exception("Servers need to be installed" + progId + "To use this feature");
            }
            return new ComObj(Activator.CreateInstance(type));
        }

        private object _val;
        /// <summary>
        /// Actual value
        /// </summary>
        public object Val
        {
            get { return _val; }
        }
        public ComObj(object comObject)
        {
            _val = comObject;
        }

        public ComObj Call(string mehtod, params object[] args)
        {
            if (_val == null)
                return null;
            var ret = _val.GetType().InvokeMember(mehtod, BindingFlags.InvokeMethod, null, _val, args);
            return new ComObj(ret);
        }
        public ComObj this[string property]
        {
            get
            {
                if (_val == null)
                    return null;
                var ret = _val.GetType().InvokeMember(property, BindingFlags.GetProperty, null, _val, null);
                return new ComObj(ret);
            }
            set
            {
                if (_val != null)
                    _val.GetType().InvokeMember(property, BindingFlags.SetProperty, null, _val, new object[] { value.Val });
            }
        }
    }
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72571321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档