2009-07-17 16 views
7

En el trabajo hacemos un uso bastante extenso del dibujo de Visio como soporte para la documentación. Lamentablemente, los archivos vsd no funcionan bien con nuestras herramientas de extracción wiki o documentación como javadoc, doxygen o naturaldocs. Si bien es posible convertir archivos de Visio en imágenes manualmente, es una molestia mantener la imagen actualizada y los archivos de imagen se verán obsoletos. Y seamos sinceros: Tener archivos generados en control de revisión se siente tan mal.Conversión de línea de comando de Visio a imagen

Así que estoy buscando una herramienta de línea de comandos que pueda convertir un archivo vsd a jpeg, png, gif o cualquier imagen que se pueda convertir a una imagen que un navegador puede mostrar. Preferiblemente se ejecutará bajo Unix, pero solo las ventanas también están bien. Puedo manejar el resto de la cadena de automatización, trabajo cron, conversión de imagen a imagen y ssh, scp, múltiples archivos, etc.

Y es por eso que estoy recurriendo a usted: No puedo encontrar una herramienta de este tipo. No creo que pueda pagar por tal herramienta. ¿Mi Google-fu está completamente apagado? ¿Me puedes ayudar?

Quiero decir, tiene que ser posible. Tiene que haber una forma de engancharse en Visio con COM y lograr que se guarde como imagen. Estoy usando Visio 2007 por cierto.

Gracias de antemano.

Respuesta

7

Abofeteé algo juntos rápidamente utilizando Visual Basic 6, y se puede descargar en: http://fournier.jonathan.googlepages.com/Vis2Img.exe

Usted sólo tiene que pasar en la ruta del archivo de Visio de entrada, a continuación, la ruta del archivo de salida (exportaciones de Visio en base a la extensión de archivo) y opcionalmente el número de página para exportar

También aquí está el código fuente que utilicé, si quiere meterse con él o convertirlo en un VBScript o algo así, debería funcionar, aunque tendría que terminar convirtiéndolo en código de enlace tardío.

esperanza de que ayuda,

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

Obtengo un "Este nombre de archivo no es válido."NUM: -2032466859 error al invocar:" Vis2Img.exe DAG.vsd DAG.gif "de la línea de comandos. Agregar 0 o 1 al comando para especificar un número de página no ayuda. Lo veré más cuando Estoy fuera del trabajo. Gracias por un gran punto de partida al menos. –

+0

Sí, necesitas la ruta completa tal como está configurada ... Podrías modificarla bastante fácilmente para pasar de forma predeterminada a app.path para encontrar la carpeta para un archivo, si no hay una ruta completa presente ... –

+0

Vis2Img.exe "' cygpath -w -a DAG.vsd' "" 'cygpath -w -a DAG.gif'" al rescate en cygwin bash :). Gracias Jon. –

-2

Tiene que haber una manera de engancharse en Visio con COM y guardarlo como imagen.

¿Por qué no intentar escribir algo usted mismo, entonces, si usted sabe cómo usar el material COM? Después de todo, si no puede encontrar nada ya hecho para hacerlo, y sabe que puede averiguar cómo hacerlo usted mismo, ¿por qué no escribir algo para hacerlo usted mismo?

EDIT: Elaborar un poco sobre lo que dije en mi comentario: escribir un script de algún tipo parece ser su mejor opción en esta situación, y Python, al menos, sería bastante útil para eso, usando los comxipos biblioteca que se encuentra aquí: http://starship.python.net/crew/theller/comtypes/ Por supuesto, como dije, si prefiere usar un lenguaje de scripting diferente, entonces podría intentar usarlo; la cuestión es que realmente solo he usado COM con VBA y Python en este momento (aparte, Microsoft tiende a referirse a "automatización" en estos días en lugar de referirse específicamente a COM, creo). Lo bueno de Python es que es un lenguaje interpretado y, por lo tanto, solo necesita una versión del intérprete para los diferentes sistemas operativos que está utilizando, con versiones para Windows, OSX, Linux, Unix, etc. Por otro lado, dudo que pueda usar COM en no -Sistemas de Windows sin algún tipo de hack, por lo que es muy posible que tenga que analizar los datos en los archivos fuente directamente (y aunque los formatos predeterminados de Visio parecen usar alguna forma de XML, es probable que sea uno de esos formatos propietarios que a Microsoft parece gustarle)

Si usted no ha utilizado Python antes, la documentación de Python tiene un buen tutorial para que la gente comenzó: http://docs.python.org/3.1/tutorial/index.html

Y, por supuesto, usted quiere que el intérprete de Python en sí: http://python.org/download/releases/3.1/ (en cuenta que puede tiene que agregar manualmente el directorio de Python a la variable de entorno PATH después de la instalación.)

Cuando escriba el script, probablemente tenga la sintaxis para ejecutar el script como "python visioexport.py <source/original file[ with path]>[ <new file[ with path]>]" (suponiendo que el archivo de script está en su Directorio de Python), con el nuevo archivo predeterminado a un archivo del mismo nombre y en la misma carpeta/directorio que el original (albe con una extensión diferente; de hecho, si lo desea, puede configurarlo para exportarlo a múltiples formatos, con el formato predeterminado al de la extensión predeterminada que elija y al ser especificado por una extensión alternativa de usted, especifique uno en el nombre del archivo.Además, es probable que pueda configurarlo de modo que si solo tiene el nuevo nombre de archivo después del archivo de origen, no se especifica ninguna ruta, se guardará con ese nuevo nombre de archivo en el directorio del archivo de origen. Y, por supuesto, si no especifica una ruta para el archivo fuente, solo un nombre de archivo, puede configurarlo para obtener el archivo del directorio actual).

Sobre el tema de los formatos de archivo: me parece que la conversión a SVG podría ser lo mejor que se puede hacer, ya que sería más eficiente y reflejaría mejor el estado de las imágenes originales como imágenes vectorizadas. Por otro lado, la conversión de un formato de Visio a SVG no es perfecta (o, al menos, no estaba en Visio 2003; no puedo encontrar una fuente de información similar a this one para Visio 2007), y como se ve here, puede que tenga que modificar el archivo XML resultante (aunque eso podría hacerse utilizando el script, después de exportar el archivo, a través de partes de la biblioteca estándar de Python). Si no te importa el tamaño de archivo adicional de los mapas de bits, y prefieres no tener que incluir código adicional para reparar los archivos SVG resultantes, entonces probablemente solo tengas que ir con un formato de mapa de bits como PNG.

+0

Mientras conozco C, algo de C++ y algo de C#, estoy bastante lejos de comprender toda la pila de software y tendría que tomarme bastante tiempo para profundizar en ella, configurar el entorno en el hogar (porque si configuro la aplicación en la computadora portátil de mi empresa, entonces el programa pertenecerá a mi empresa), encuentre las llamadas al método correcto, asegúrese de que se ejecute bien con XP y Vista, cree una página web para que otros puedan usarlo, etc. Hay un montón de sobrecarga en este pequeño programa y esperaba que alguien lo hubiera pagado con su tiempo para que yo pudiera pagarlo con dinero. Ahora tengo que hacerlo ... –

+0

Pido disculpas por el tiempo de espera y me parece extraño que nadie más haya dado una respuesta. En cualquier caso, le sugiero que consulte Python y la biblioteca de comxpes disponible; proporciona una muy buena vinculación de Python para la API COM, y es mucho más fácil trabajar con ella que utilizar COM con C, C++ o C#. Lo probaría yo mismo con Visio, pero no tengo una copia de Visio disponible. – JAB

+0

Se olvidó de mencionar: incluso si no conoce Python, no debería tomar demasiado tiempo para aprender y familiarizarse con él; Además, si hay otro lenguaje de scripting que prefiera, probablemente también pueda verificar si hay algún tipo de biblioteca/complemento de enlace COM para eso. – JAB

2

F # 2.0 script:

 
//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

Si alguien lo necesitara, creé una versión de Powershell de la secuencia de comandos que está disponible [aquí] (https://gist.github.com/ap0llo/1e24d9e66ef58f5de064c8aba2198b9e) – Apollo

Cuestiones relacionadas