在工作中,我们非常广泛地使用Visio绘图来支持文档。不幸的是,vsd文件不能很好地与我们的wiki或文档提取工具,如javadoc,doxygen或naturaldocs配合使用。虽然可以手动将Visio文件转换为图像,但使图像保持最新是一件麻烦的事情,而且图像文件肯定会过时。让我们面对它:在修订控制中生成文件感觉非常不对劲。
所以我正在寻找一个命令行工具,可以将vsd文件转换为jpeg、png、gif或任何可以转换为浏览器可以显示的图像的图像。优选地,它可以在unix下运行,但也可以只在windows下运行。我可以处理自动化链的其余部分,cron作业,图像到图像的转换和ssh,scp,多个文件,等等。
这就是为什么我会求助于你:我找不到这样的工具。我想我甚至买不起这样的工具。我的Google-fu完全关闭了吗?你能帮帮我吗?
我的意思是,这必须是可能的。必须有一种方法可以通过COM连接到Visio,并将其保存为图像。顺便说一下,我正在使用Visio 2007。
提前谢谢。
发布于 2009-07-20 16:03:57
我用VB6快速组装了一些东西,你可以从http://fournier.jonathan.googlepages.com/Vis2Img.exe下载
您只需传入输入visio文件路径,然后传入输出文件路径(visio根据文件扩展名导出),还可以传入要导出的页码。
这里还有我使用的源代码,如果你想把它弄乱或者把它变成VBScript或者别的什么,它应该可以工作,尽管你需要把它转换成后期绑定的代码。
希望这能有所帮助,
琼恩
Dim TheCmd As String
Const visOpenRO = 2
Const visOpenMinimized = 16
Const visOpenHidden = 64
Const visOpenMacrosDisabled = 128
Const visOpenNoWorkspace = 256
Sub Main()
' interpret command line arguments - separated by spaces outside of double quotes
TheCmd = Command
Dim TheCmds() As String
If SplitCommandArg(TheCmds) Then
If UBound(TheCmds) > 1 Then
Dim PageNum As Long
If UBound(TheCmds) >= 3 Then
PageNum = Val(TheCmds(3))
Else
PageNum = 1
End If
' if the input or output file doesn't contain a file path, then assume the same
If InStr(1, TheCmds(1), "\") = 0 Then
TheCmds(1) = App.Path & "\" & TheCmds(1)
End If
If InStr(1, TheCmds(2), "\") = 0 Then
TheCmds(2) = App.Path & "\" & TheCmds(2)
End If
ConvertVisToImg TheCmds(1), TheCmds(2), PageNum
Else
' no good - need an in and out file
End If
End If
End Sub
Function ConvertVisToImg(ByVal InVisPath As String, ByVal OutImgPath As String, PageNum As Long) As Boolean
ConvertVisToImg = True
On Error GoTo PROC_ERR
' create a new visio instance
Dim VisApp As Visio.Application
Set VisApp = CreateObject("Visio.Application")
' open invispath
Dim ConvDoc As Visio.Document
Set ConvDoc = VisApp.Documents.OpenEx(InVisPath, visOpenRO + visOpenMinimized + visOpenHidden + visOpenMacrosDisabled + visOpenNoWorkspace)
' export to outimgpath
If Not ConvDoc.Pages(PageNum) Is Nothing Then
ConvDoc.Pages(PageNum).Export OutImgPath
Else
MsgBox "Invalid export page"
ConvertVisToImg = False
GoTo PROC_END
End If
' close it off
PROC_END:
On Error Resume Next
VisApp.Quit
Set VisApp = Nothing
Exit Function
PROC_ERR:
MsgBox Err.Description & vbCr & "Num:" & Err.Number
GoTo PROC_END
End Function
Function SplitCommandArg(ByRef Commands() As String) As Boolean
SplitCommandArg = True
'read through command and break it into an array delimited by space characters only when we're not inside double quotes
Dim InDblQts As Boolean
Dim CmdToSplit As String
CmdToSplit = TheCmd 'for debugging command line parser
'CmdToSplit = Command
Dim CharIdx As Integer
ReDim Commands(1 To 1)
For CharIdx = 1 To Len(CmdToSplit)
Dim CurrChar As String
CurrChar = Mid(CmdToSplit, CharIdx, 1)
If CurrChar = " " And Not InDblQts Then
'add another element to the commands array if InDblQts is false
If Commands(UBound(Commands)) <> "" Then ReDim Preserve Commands(LBound(Commands) To UBound(Commands) + 1)
ElseIf CurrChar = Chr(34) Then
'set InDblQts = true
If Not InDblQts Then InDblQts = True Else InDblQts = False
Else
Commands(UBound(Commands)) = Commands(UBound(Commands)) & CurrChar
End If
Next CharIdx
End Function发布于 2016-01-11 22:59:25
您可以尝试"Visio to image“转换器
http://soft.postpdm.com/visio2image.html
使用MS Visio 2007和2010进行了测试
发布于 2009-07-17 20:34:51
必须有一种方法可以通过COM连接到Visio,并将其保存为图像。
那么,如果你知道如何使用COM的东西,为什么不试着自己写一些东西呢?毕竟,如果你找不到任何已经制作好的东西来做这件事,而且你知道你可以自己找出怎么做,为什么不自己写一些东西来做呢?
编辑:详细阐述一下我在评论中所说的:在这种情况下,编写某种类型的脚本似乎是最好的选择,至少Python在这方面会非常有用,使用这里的comtype库:当然,正如我所说,如果你喜欢使用不同的脚本语言,那么你可以尝试使用它;问题是,在这一点上,我只将COM与http://starship.python.net/crew/theller/comtypes/和Python一起使用(顺便说一句,微软现在倾向于使用“自动化”,而不是专门引用COM )。Python语言的优点是它是一种解释型语言,因此你只需要为你正在使用的不同的OSes提供不同版本的解释器,具有Windows,OSX,Linux,Unix等版本。另一方面,我怀疑你能不能在非Windows系统上使用COM而不做任何修改,所以你很可能不得不直接解析源文件中的数据(尽管Visio的默认格式似乎使用了某种形式的XML,但它可能是微软喜欢的那些专有格式之一)。
如果您以前没有使用过Python,Python文档中有一个很好的入门教程:http://docs.python.org/3.1/tutorial/index.html
当然,您还需要Python解释器本身:http://python.org/download/releases/3.1/ (请注意,您可能需要在安装后将Python目录手动添加到PATH环境变量中。)
在编写脚本时,运行脚本的语法可能类似于"python visioexport.py <source/original file[ with path]>[ <new file[ with path]>]“(假设脚本文件在您的Python目录中),新文件默认为与原始文件同名的文件,并且位于相同的文件夹/目录中(尽管扩展名不同;实际上,如果您愿意,可以将其设置为导出为多种格式,默认格式为您选择的任何默认扩展名,并由您在文件名中指定的备用扩展名指定)。同样,您也可以对其进行设置,以便如果只在源文件之后使用新的文件名,而没有指定路径,那么它将以该新文件名保存到源文件的目录中。当然,如果您不指定源文件的路径,只指定一个文件名,您可以将其设置为从当前目录获取文件)。
关于文件格式的主题:在我看来,转换为SVG可能是最好的做法,因为它将更节省空间,并更好地反映原始图像作为矢量化图像的状态。另一方面,从Visio格式到SVG的转换并不完美(或者,至少在Visio2003中没有;我找不到类似于Visio2007的this one的信息源),正如here所见,您可能必须修改生成的XML文件(尽管这可以使用脚本在导出文件之后通过Python标准库的一部分来完成)。如果您不介意位图的额外文件大小,并且不希望包含额外的代码来修复生成的SVG文件,那么您可能应该使用位图格式,比如PNG。
https://stackoverflow.com/questions/1145269
复制相似问题