我有一个生成SVG图的应用程序,我们希望创建一个导出到Visio选项,理想情况下,这个选项将在幕后(通过服务器端C#)获取一个SVG文件,并将其直接转换为用户可以下载的MS Visio .vsdx文件,然后在Visio中无缝地打开和编辑(而不必下载SVG文件,然后将其导入Visio)。实际上,尝试复制Visio在后端C#中提供的"Open“功能。
我已经看到了很多从Visio到SVG的答案,但事实恰恰相反。
我还知道.vsdx只是一个压缩文件,但是具有这个扩展名。里面有一堆特定于visio的文件和文件夹--如果有人知道这些文件/文件夹及其内容的最低要求是什么,以及SVG适合哪里,也许这是一种方法。
如有任何指导,将不胜感激。
发布于 2022-06-15 10:56:39
挖掘这个,信用/来源:https://programmer.group/5c650f3227420.html
SVG可以转换为Visio的vsd格式。这个方法很简单。主要方法是打开SVG文件并将其保存为vsd文件。调用方法如下:
/// <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组件,您还可以提供直观的提示,而不是程序错误。
该类的代码如下:
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 });
}
}
}
}
https://stackoverflow.com/questions/72571321
复制相似问题