2009-07-17 19 views
7

Al lavoro viene utilizzato in modo abbastanza esteso il disegno di Visio come supporto per la documentazione. Sfortunatamente i file vsd non funzionano bene con i nostri strumenti di estrazione di documentazione o wiki come javadoc, doxygen o naturaldocs. Mentre è possibile convertire i file Visio in immagini manualmente, è solo una seccatura mantenere l'immagine corrente e i file immagine sono destinati a non essere aggiornati. E diciamocelo: avere i file generati nel controllo di revisione sembra così sbagliato.Conversione da riga di comando a immagine da riga di comando

Quindi sto cercando uno strumento da riga di comando in grado di convertire un file vsd in jpeg, png, gif o qualsiasi immagine che può essere convertita in un'immagine che può essere visualizzata da un browser. Preferibilmente funzionerà sotto Unix, ma anche le finestre sono perfette. Posso gestire il resto della catena di automazione, cron job, conversione di immagini in immagine e ssh, scp, file multipli, ecc.

Ed è per questo che mi rivolgo a te: non riesco a trovare uno strumento del genere. Non penso di poter nemmeno pagare per uno strumento del genere. Il mio Google-fu è completamente disattivato? Mi potete aiutare?

Voglio dire, deve essere possibile. Deve esserci un modo per collegarsi a Visio con COM e ottenerlo per salvare come immagine. A proposito, sto usando Visio 2007.

Grazie in anticipo.

risposta

7

ho schiaffeggiato insieme qualcosa velocemente utilizzando VB6, e si può scaricare all'indirizzo: http://fournier.jonathan.googlepages.com/Vis2Img.exe

Basta passare nel percorso del file di input visio, quindi il percorso del file di output (esportazioni Visio base all'estensione del file) e, opzionalmente, il numero della pagina da esportare.

Anche qui è il codice sorgente che ho usato, se si vuole scherzare con esso o trasformarlo in un VBScript o qualcosa del genere, dovrebbe funzionare, anche se avresti bisogno di finire di convertirlo in codice in ritardo.

speranza che aiuta,

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

Ottengo un "Questo nome file non è valido."NUM: -2032466859 errore durante il richiamo:" Vis2Img.exe DAG.vsd DAG.gif "dalla riga di comando, l'aggiunta di 0 o 1 al comando per specificare un numero di pagina non è di aiuto. Sono fuori dal lavoro, grazie per un ottimo punto di partenza, almeno –

+0

Sì, hai bisogno del percorso completo nel modo in cui è stato impostato ... Potresti modificarlo abbastanza facilmente in modo predefinito in app.path per trovare la cartella per un file, se non è presente un percorso completo ... –

+0

Vis2Img.exe "' cygpath -w -a DAG.vsd' "" 'cygpath -w -a DAG.gif'" in soccorso in cygwin bash :). Grazie Jon –

-2

Deve esserci un modo per collegarsi a Visio con COM e farlo salvare come immagine.

Perché non provare a scrivere qualcosa da soli, quindi, se si sa come usare la roba di COM? Dopotutto, se non riesci a trovare qualcosa già fatto per farlo, e sai che puoi capire come farlo da solo, perché non scrivere qualcosa per farlo da solo?

EDIT: Elaborazione un po 'su quello che ho dichiarato nel mio commento: scrivere uno script di qualche tipo sembra essere la scelta migliore in questa situazione, e Python, almeno, sarebbe abbastanza utile per questo, usando i comtypes libreria trovata qui: http://starship.python.net/crew/theller/comtypes/ Naturalmente, come ho detto, se si preferisce utilizzare un linguaggio di scripting diverso, si potrebbe provare a utilizzarlo; il fatto è che in questo momento ho usato solo COM con VBA e Python (per inciso, in questi giorni Microsoft tende a riferirsi a "Automazione" piuttosto che riferirsi specificamente a COM, credo.) La cosa bella di Python è che è un linguaggio interpretato, e quindi hai solo bisogno di una versione dell'interprete per i diversi sistemi operativi che stai usando, con versioni per Windows, OSX, Linux, Unix, ecc. D'altra parte, dubito che tu possa usare COM su non -I sistemi Windows senza una sorta di hack, quindi potresti dover analizzare i dati direttamente nei file sorgente (e anche se i formati di default di Visio sembrano utilizzare una qualche forma di XML, è probabilmente uno di quei formati proprietari che Microsoft sembra amare).

Se non avete usato Python prima, la documentazione Python ha un buon tutorial per convincere la gente iniziare: http://docs.python.org/3.1/tutorial/index.html

E, naturalmente, si vorrà l'interprete Python stesso: http://python.org/download/releases/3.1/ (Si noti che potrebbe è necessario aggiungere manualmente la directory Python alla variabile di ambiente PATH dopo l'installazione.)

Quando si scrive lo script, è probabile che la sintassi per l'esecuzione dello script sia simile a "python visioexport.py <source/original file[ with path]>[ <new file[ with path]>]" (presupponendo che il file di script sia nel Directory Python), con il nuovo file che esegue il default su un file con lo stesso nome e nella stessa cartella/directory dell'originale (albe con una diversa estensione; in effetti, se lo desideri, puoi configurarlo per esportarlo in più formati, con il formato predefinito a quello di qualsiasi estensione predefinita scelta e specificata da un'estensione alternativa di te specifica uno nel nome del file.Inoltre, è probabile che tu possa configurarlo in modo che se hai solo il nuovo nome di file dopo il file sorgente, nessun percorso specificato, salverà con quel nuovo nome di file nella directory del file sorgente. E, naturalmente, se non si specifica un percorso per il file sorgente, solo un nome file, è possibile impostarlo per ottenere il file dalla directory corrente).

Sull'argomento dei formati di file: mi sembra che la conversione in SVG potrebbe essere la cosa migliore da fare, in quanto sarebbe più efficiente in termini di spazio e rifletterebbe meglio lo stato delle immagini originali come immagini vettoriali. D'altra parte, la conversione da un formato Visio a SVG non è perfetta (o, almeno, non era in Visio 2003, non riesco a trovare una fonte di informazioni simile a this one per Visio 2007), e come visto here, potrebbe essere necessario modificare il file XML risultante (anche se ciò potrebbe essere fatto utilizzando lo script, dopo che il file è stato esportato, tramite parti della libreria standard Python). Se non ti interessa la dimensione aggiuntiva dei file di bitmap e preferisci non dover includere codice aggiuntivo per correggere i file SVG risultanti, allora probabilmente dovresti usare un formato bitmap come PNG.

+0

Mentre conosco C, un po 'di C++ e un C# sono abbastanza lontano dalla comprensione dell'intero stack di software e dovrei impiegare un po' di tempo per scavare in esso, impostare l'ambiente a casa (perché se faccio l'app sul mio computer portatile aziendale, allora il programma apparterrà alla mia azienda), trovo le giuste chiamate di metodo, mi assicuro che funzioni bene con XP e Vista, creo una pagina web in modo che altri possano usarlo, ecc. C'è un sacco di spese generali in questo piccolo programma e speravo che qualcuno lo avesse pagato con il suo tempo in modo che potessi pagarlo con i soldi invece. Ora devo farlo ... –

+0

Mi scuso per il tempo di attesa, e trovo strano che nessun altro abbia fornito una risposta. Indipendentemente da ciò, suggerisco di controllare Python e la libreria di comtypes disponibile; fornisce un binding Python molto bello per l'API COM, ed è molto più semplice lavorare con l'uso di COM con C, C++ o C#. L'ho provato con Visio, ma non ho una copia di Visio disponibile. – JAB

+0

Hai dimenticato di dire: anche se non conosci Python, non dovrebbe impiegare troppo tempo per imparare e familiarizzare con esso; inoltre, se esiste un altro linguaggio di scripting che preferisci, potresti probabilmente verificare se esiste anche una sorta di libreria/componente aggiuntivo di collegamento COM. – 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

Se qualcuno dovesse averne bisogno, ho creato una versione di Powershell dello script che è disponibile [qui] (https://gist.github.com/ap0llo/1e24d9e66ef58f5de064c8aba2198b9e) – Apollo

Problemi correlati