Visio到图像命令行转换

时间:2009-07-17 19:38:40

标签: windows visio

在工作中,我们大量使用Visio绘图作为文档支持。不幸的是,vsd文件与我们的wiki或文档提取工具(如javadoc,doxygen或naturaldocs)不能很好地兼容。虽然可以手动将Visio文件转换为图像,但保持图像最新并且图像文件必然会过时是一件麻烦事。让我们面对现实:在版本控制中生成文件感觉非常错误。

所以我正在寻找一个命令行工具,它可以将vsd文件转换为jpeg,png,gif或任何可以转换为浏览器可以显示的图像的图像。最好是在unix下运行,但只有窗口也可以。我可以处理自动化链的其余部分,cron作业,图像到图像转换以及ssh,scp,多个文件等。

这就是为什么我转向你:我找不到这样的工具。我认为我甚至无法支付这样的工具。我的Google-fu完全关闭了?你能救我吗?

我的意思是,它必须是可能的。必须有一种方法可以通过COM挂钩到Visio并将其保存为图像。我顺便使用Visio 2007。

提前致谢。

4 个答案:

答案 0 :(得分:7)

我使用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

答案 1 :(得分:2)

F#2.0脚本:

//Description:
// Generates images for all Visio diagrams in folder were run according to pages names
//Tools:
// Visio 2010 32bit is needed to open diagrams (I also installed VisioSDK32bit.exe on my Windows 7 64bit)

#r "C:/Program Files (x86)/Microsoft Visual Studio 10.0/Visual Studio Tools for Office/PIA/Office14/Microsoft.Office.Interop.Visio.dll"

open System
open System.IO

open Microsoft.Office.Interop.Visio

let visOpenRO = 2
let visOpenMinimized = 16
let visOpenHidden = 64
let visOpenMacrosDisabled = 128
let visOpenNoWorkspace = 256

let baseDir = Environment.CurrentDirectory;

let getAllDiagramFiles = Directory.GetFiles(baseDir,"*.vsd")

let drawImage fullPathToDiagramFile = 
    let diagrammingApplication = new  ApplicationClass()
    let flags = Convert.ToInt16(visOpenRO + visOpenMinimized + visOpenHidden + visOpenMacrosDisabled + visOpenNoWorkspace)
    let document = diagrammingApplication.Documents.OpenEx(fullPathToDiagramFile,flags)
    for page in document.Pages do
        let imagePath = Path.Combine(baseDir, page.Name + ".png")
        page.Export (imagePath)
    document.Close()
    diagrammingApplication.Quit()   

let doItAll =     
    Array.iter drawImage getAllDiagramFiles

doItAll

答案 2 :(得分:0)

您可以尝试“Visio to image”转换器

http://soft.postpdm.com/visio2image.html

使用MS Visio 2007和2010测试

答案 3 :(得分:-2)

  

必须有一种方法可以通过COM挂钩到Visio并将其保存为图像。

为什么不尝试自己写一些东西,然后,如果你知道如何使用COM的东西?毕竟,如果你找不到任何已经做过的东西,而且你知道你可以自己弄清楚如何去做,为什么不自己写一些东西呢?

编辑:详细说明我在评论中所说的内容:在这种情况下编写某种类型的脚本似乎确实是你最好的选择,至少Python对于它来说非常有用,使用comtypes库在这里找到:http://starship.python.net/crew/theller/comtypes/当然,正如我所说,如果您更喜欢使用不同的脚本语言,那么您可以尝试使用它;事实上,我此时才真正使用过VBA和Python的COM(顺便说一句,微软现在倾向于引用“自动化”而不是专门引用COM,我相信。)Python的优点在于它是一种解释型语言,因此您只需要一个适用于您正在使用的不同操作系统的解释器版本,适用于Windows,OSX,Linux,Unix等版本。另一方面,我怀疑您可以在非-Windows系统没有某种黑客攻击,所以你可能必须直接解析源文件中的数据(即使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的转换并不完美(或者,至少,它不在Visio 2003中;我找不到类似于this one的Visio 2007的信息来源) ,如同here所示,您可能必须修改生成的XML文件(尽管可以通过脚本在文件导出后通过Python标准库的某些部分完成)。如果您不介意位图的额外文件大小,并且您不必包含其他代码来修复生成的SVG文件,那么您可能应该采用位图格式,例如PNG。