2009-07-17 23 views
7

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

Итак, я ищу инструмент командной строки, который может конвертировать файл vsd в jpeg, png, gif или любое изображение, которое можно преобразовать в изображение, которое может отображать браузер. Предпочтительно, он будет работать под unix, но окна тоже прекрасны. Я могу обрабатывать остальную часть цепочки автоматизации, работу cron, преобразование изображения в изображение и ssh, scp, несколько файлов и т. Д.

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

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

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

ответ

7

я ударил что-то вместе быстро, используя 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 
+0

Я получаю «Это имя файла недействительно.«Ошибка NUM: -2032466859 при вызове:« Vis2Img.exe DAG.vsd DAG.gif »из командной строки. Добавление 0 или 1 к команде для указания номера страницы не помогает. Я буду смотреть в нее больше, Я не работаю. Спасибо за отличную отправную точку. –

+0

Да, вам нужен полный путь, как это настроить ... Вы могли бы легко настроить его по умолчанию, чтобы просто поменять app.path, чтобы найти папку для файл, если полный путь отсутствует ... –

+0

Vis2Img.exe «cygpath -w -a DAG.vsd» «« cygpath -w -a DAG.gif »на помощь в cygwin bash :). Спасибо Jon. –

-2

Должен быть способ подключиться к 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), при этом новый файл по умолчанию совпадает с файлом с тем же именем и в той же папке/каталоге, что и оригинал (albe он с другим расширением; на самом деле, если вы хотите, вы можете настроить его для экспорта в несколько форматов, при этом формат по умолчанию не зависит от того, что вы выбрали по умолчанию, и указывается альтернативным расширением, указанным вами в имени файла.Кроме того, вы можете настроить его таким образом, чтобы, если у вас есть только новое имя файла после исходного файла, указанного пути не будет сохранено с этим новым именем файла в каталоге исходного файла. И, конечно, если вы не укажете путь для исходного файла, просто имя файла, вы можете настроить его, чтобы получить файл из текущего каталога).

По теме форматов файлов: мне кажется, что преобразование в SVG могло бы быть лучше всего, поскольку это было бы более экономичным по площади и лучше отражало бы статус исходных изображений как векторные изображения. С другой стороны, преобразование из формата Visio в SVG не является идеальным (или, по крайней мере, это не было в Visio 2003, я не могу найти источник информации, подобный this one для Visio 2007), и, как видно here, возможно, вам придется изменить полученный XML-файл (хотя это можно было бы сделать с помощью скрипта после экспорта файла через части стандартной библиотеки Python). Если вы не возражаете против дополнительного размера файлов растровых изображений, и вам не нужно включать дополнительный код для исправления результирующих SVG-файлов, тогда вы, вероятно, должны просто пойти с растровым форматом, таким как PNG.

+0

Хотя я знаю C, некоторые C++ и некоторые C#, я довольно далек от понимания всего стека программного обеспечения, и мне пришлось бы потратить довольно много времени, чтобы вникать в него, настройте среду на дому (потому что, если я сделаю приложение на своем ноутбуке компании, тогда программа будет принадлежать моей компании), найдите нужные вызовы методов, убедитесь, что они отлично воспроизводятся с XP и Vista, создают веб-страницу так что другие могут использовать его и т. д. В этой небольшой программе много накладных расходов, и я надеялся, что кто-то заплатил за это своим временем, чтобы я мог заплатить за это деньгами. Теперь я должен это сделать ... –

+0

Я прошу прощения за время ожидания и считаю странным, что никто другой не дал ответа. Несмотря на это, я предлагаю вам проверить Python и доступную библиотеку comtypes; он обеспечивает очень хорошую привязку к Python для COM API, и работать с ним намного проще, чем с помощью COM с C, C++ или C#. Я проверил это самостоятельно с Visio, но у меня нет копии Visio. – JAB

+0

Забыл упомянуть: даже если вы не знаете Python, не стоит слишком долго учиться и познакомиться с ним; также, если есть какой-то другой язык сценариев, который вы предпочитаете, вы, вероятно, можете проверить, есть ли какая-то библиотека связывания COM/надстройка для этого. – JAB

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 
+0

Если кому-то это понадобится, я создал версию сценария Powershell, которая доступна [здесь] (https://gist.github.com/ap0llo/1e24d9e66ef58f5de064c8aba2198b9e) – Apollo

Смежные вопросы