首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visio到图像的命令行转换

Visio到图像的命令行转换
EN

Stack Overflow用户
提问于 2009-07-17 19:38:40
回答 3查看 6.4K关注 0票数 9

在工作中,我们非常广泛地使用Visio绘图来支持文档。不幸的是,vsd文件不能很好地与我们的wiki或文档提取工具,如javadoc,doxygen或naturaldocs配合使用。虽然可以手动将Visio文件转换为图像,但使图像保持最新是一件麻烦的事情,而且图像文件肯定会过时。让我们面对它:在修订控制中生成文件感觉非常不对劲。

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

这就是为什么我会求助于你:我找不到这样的工具。我想我甚至买不起这样的工具。我的Google-fu完全关闭了吗?你能帮帮我吗?

我的意思是,这必须是可能的。必须有一种方法可以通过COM连接到Visio,并将其保存为图像。顺便说一下,我正在使用Visio 2007。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-20 16:03:57

我用VB6快速组装了一些东西,你可以从http://fournier.jonathan.googlepages.com/Vis2Img.exe下载

您只需传入输入visio文件路径,然后传入输出文件路径(visio根据文件扩展名导出),还可以传入要导出的页码。

这里还有我使用的源代码,如果你想把它弄乱或者把它变成VBScript或者别的什么,它应该可以工作,尽管你需要把它转换成后期绑定的代码。

希望这能有所帮助,

琼恩

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2016-01-11 22:59:25

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

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

使用MS Visio 2007和2010进行了测试

票数 -1
EN

Stack Overflow用户

发布于 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。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1145269

复制
相关文章

相似问题

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