Visio для преобразования изображения в командной строке - PullRequest
7 голосов
/ 17 июля 2009

На работе мы широко используем рисование Visio для поддержки документации. К сожалению, файлы vsd не очень хорошо работают с нашими инструментами извлечения вики или документации, такими как javadoc, doxygen или naturaldocs. Хотя можно конвертировать файлы Visio в изображения вручную, просто нужно поддерживать актуальность изображения, а файлы изображений обязательно устаревают. И давайте посмотрим правде в глаза: сгенерированные файлы в системе контроля версий кажутся такими неправильными.

Итак, я ищу инструмент командной строки, который может конвертировать файл VSD в JPEG, PNG, GIF или любое изображение, которое можно преобразовать в изображение, которое может отображать браузер. Желательно, чтобы он работал под Unix, но с Windows это тоже хорошо. Я могу справиться с остальной частью цепочки автоматизации, заданием cron, преобразованием изображений в изображения и ssh, scp, несколькими файлами и т. Д.

И вот почему я обращаюсь к вам: я не могу найти такой инструмент. Я не думаю, что могу даже заплатить за такой инструмент. Мой Google-фу полностью выключен? Вы можете мне помочь?

Я имею в виду, это должно быть возможно. Должен быть способ подключиться к Visio с помощью COM и заставить его сохранить изображение. Кстати, я использую Visio 2007.

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 20 июля 2009

Я быстро соединил что-то, используя VB6, и вы можете скачать его по адресу: http://fournier.jonathan.googlepages.com/Vis2Img.exe

Вы просто передаете путь к входному файлу Visio, затем путь к выходному файлу (экспорт Visio на основе расширения файла) и, при необходимости, номер экспортируемой страницы.

Также вот исходный код, который я использовал, если вы хотите возиться с ним или превратить его в VBScript или что-то еще, он должен работать, хотя вам нужно будет завершить преобразование его в код с поздней привязкой.

надеюсь, что поможет,

Jon

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
2 голосов
/ 25 мая 2011

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
0 голосов
/ 11 января 2016

Вы можете попробовать конвертер "Visio в изображение"

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

Протестировано с MS Visio 2007 и 2010

0 голосов
/ 18 июля 2009

Должен быть способ подключиться к Visio с помощью COM и заставить его сохранить изображение.

Почему бы не попробовать написать что-нибудь самостоятельно, если вы знаете, как использовать COM-материал? В конце концов, если вы не можете найти что-то, что уже сделано для этого, и знаете, что можете придумать, как это сделать самостоятельно, почему бы не написать что-нибудь, чтобы сделать это самостоятельно?

РЕДАКТИРОВАТЬ: немного поработав над тем, что я сказал в своем комментарии: написание какого-то скрипта, кажется, является вашим лучшим вариантом в этой ситуации, и Python, по крайней мере, был бы весьма полезен для этого, используя библиотеку comtypes найдено здесь: http://starship.python.net/crew/theller/comtypes/ Конечно, как я уже сказал, если вы предпочитаете использовать другой язык сценариев, то вы можете попробовать использовать это; Дело в том, что на данный момент я на самом деле использовал только COM с VBA и Python (кроме того, в наши дни Microsoft имеет тенденцию ссылаться на «Автоматизацию», а не на конкретные ссылки на COM, я считаю.) Хорошая вещь в Python заключается в том, что это интерпретируемый язык, и поэтому вам просто нужна версия интерпретатора для различных операционных систем, которые вы используете, с версиями для Windows, OSX, Linux, Unix и т. д. С другой стороны, я сомневаюсь, что вы можете использовать COM на не - Windows-системы без какого-либо взлома, поэтому вам, возможно, придется анализировать данные непосредственно в исходных файлах (и хотя форматы по умолчанию в Visio, похоже, используют некоторую форму XML, это, вероятно, один из тех проприетарных форматов, которые Microsoft, похоже, любит ).

Если вы раньше не использовали 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; я не могу найти источник информации, подобный этот для Visio 2007), и, как видно здесь , вам, возможно, придется изменить результирующий XML-файл (хотя это можно сделать с помощью скрипта после экспорта файла через части стандартной библиотеки Python). Если вы не возражаете против дополнительного размера файлов растровых изображений и предпочитаете не включать дополнительный код для исправления результирующих файлов SVG, то вам, вероятно, следует просто использовать растровый формат, например PNG.

...