9
votes

Visio de conversion de ligne de commande d'image

Au travail, nous utilisons assez vaste de dessin Visio comme support pour la documentation. Malheureusement, les fichiers VSD ne jouent pas bien avec nos outils de wiki ou d'extraction de documents tels que javadoc, doxygen ou naturaldocs. Bien qu'il soit possible de convertir des fichiers Visio aux images manuellement, il est juste un souci de garder le courant de l'image et les fichiers d'image sont liés à sortir de ce jour. Et avouons-le:. Avoir les fichiers générés dans le contrôle de révision se sent si mal

Je suis à la recherche d'un outil de ligne de commande qui permet de convertir un fichier VSD à jpeg, png, gif ou une image qui peut être convertie en une image qu'un navigateur peut afficher. De préférence, il sera exécuté sous unix, mais les fenêtres n'est aussi très bien. Je peux gérer le reste de la chaîne d'automatisation, tâche cron, l'image à la conversion d'image et ssh, scp, plusieurs fichiers, etc.

Et voilà pourquoi je suis à vous tourner: Je ne peux pas trouver un tel outil. Je ne pense pas que je peux même payer pour un tel outil. Mon Google-fu complètement? Pouvez-vous me aider?

Je veux dire, il a obtenu d'être possible. Il doit y avoir un moyen de crochet dans Visio avec COM et l'obtenir pour enregistrer en tant qu'image. J'utilise Visio 2007 par la manière.

Merci à l'avance.


0 commentaires

4 Réponses :


-2
votes

Il doit être un moyen de crochet dans Visio avec COM et l'obtenir pour enregistrer en tant qu'image.

Pourquoi ne pas essayer d'écrire quelque chose vous-même, alors, si vous savez comment utiliser des trucs COM? Après tout, si vous ne trouvez rien déjà fait pour le faire, et vous savez que vous pouvez savoir comment faire vous-même, pourquoi ne pas quelque chose écrire à faire vous-même?

EDIT: Développant un peu ce que je l'ai dit dans mon commentaire: écrire un script de quelque sorte ne semble être votre meilleure option dans cette situation, et Python, au moins, serait tout à fait utile pour que, en utilisant la bibliothèque comtypes trouvé ici: http://starship.python.net/crew/theller/comtypes/ Bien sûr, comme je l'ai dit, si vous préférez utiliser un langage de script, vous pouvez essayer d'utiliser cela; la chose est, je n'ai vraiment COM utilisé avec VBA et Python à ce moment (En aparté, Microsoft a tendance à se référer à « Automation » ces jours-ci plutôt que spécifiquement référence COM, je crois.) La bonne chose à propos de Python est que c'est un langage interprété, et donc vous juste besoin d'une version de l'interprète pour les différents systèmes d'exploitation que vous utilisez, avec des versions pour Windows, Mac OS X, Linux, Unix, etc. d'autre part, je doute que vous pouvez utiliser COM non -Windows systèmes sans une sorte de hack, de sorte que vous pouvez très bien avoir pour analyser les données contenues dans les fichiers source directement (et même si les formats par défaut de Visio semblent utiliser une certaine forme de XML, il est probablement l'un de ces formats propriétaires de Microsoft semble amour ).

Si vous ne l'avez pas utilisé Python avant, la documentation Python a un bon tutoriel pour les gens ont commencé: http://docs.python.org/3.1/tutorial/index.html

Et, bien sûr, vous voulez que le Python interprète lui-même: http: // python. org / télécharger / releases / 3.1 / (Notez que vous pouvez ajouter manuellement le répertoire Python à la variable d'environnement PATH après l'installation.)

Lorsque vous écrivez le script, vous pouvez probablement la syntaxe pour exécuter le script quelque chose comme « python visioexport.py [] »(en supposant que le fichier script est dans votre répertoire Python), avec le nouveau fichier par défaut à un fichier du même nom et dans le même dossier / répertoire que l'original (mais avec une extension différente, en fait, si vous le souhaitez, vous pouvez le configurer pour exporter vers des formats multiples, avec le format par défaut à celui de tout l'extension par défaut de votre choix et être spécifié par une extension autre vous spécifiez un dans le nom du fichier. de plus, vous pouvez probablement le mettre de sorte que si vous avez seulement le nouveau nom de fichier après le fichier source, aucun chemin d'accès spécifié, il va enregistrer avec ce nouveau nom de fichier dans le répertoire du fichier source. Et, bien sûr, si vous ne spécifiez pas de chemin pour la fichier source, juste un nom de fichier, vous pouvez le configurer pour obtenir le fichier du répertoire courant).

Sur le sujet des formats de fichiers: il me semble que la conversion en SVG pourrait être la meilleure chose à faire, car il serait plus efficace l'espace et refléterait mieux le statut des images originales en images vectorisées. D'autre part, la conversion d'un format Visio SVG est pas parfait (ou, au moins, il n'a pas été dans Visio 2003, je ne peux pas trouver une source d'information similaire à celui-ci pour Visio 2007), et comme on le voit 4 commentaires

Même si je sais C, certains C ++ et une C # Je suis assez loin de comprendre la pile ensemble de logiciels et je dois prendre un peu de temps pour creuser en elle, mettre en place l'environnement à la maison (parce que si je fais l'application sur mon ordinateur portable de l'entreprise, le programme appartiendra à mon entreprise), trouver les appels de méthode droite, assurez-vous qu'il joue un peu bien avec XP et Vista, créez une page Web afin que d'autres puissent l'utiliser, etc. il est beaucoup de frais généraux dans ce petit programme et j'espère que quelqu'un avait payé avec son temps pour que je puisse payer avec l'argent à la place. Maintenant, je dois le faire ...


Je présente mes excuses pour le temps d'attente, et trouve étrange que personne d'autre n'a fourni une réponse. Peu importe, je vous suggère de vérifier Python et la bibliothèque comtypes disponibles; il offre une très belle binding Python pour l'API COM, et est beaucoup plus facile à travailler que l'utilisation COM avec C, C ++ ou C # serait. Je le tester moi-même avec Visio, mais je n'ai pas une copie de Visio disponible.


Vous avez oublié de mentionner: Même si vous ne connaissez pas Python, il ne devrait pas prendre trop de temps pour apprendre et se familiariser avec elle; ainsi, s'il y a un autre langage de script que vous préférez, vous pouvez probablement vérifier s'il y a une sorte de COM bibliothèque de liaison / add-in pour cela aussi.


Je connais un petit morceau de python, mais puisque Jon est un peu plus proche de la marque, toutes les modifications que je ferai ferai probablement dans VB6. Merci de votre aide. J'ai également remarqué les problèmes avec SVG à Visio 2003. Depuis lors, je suis resté clair de SVG quand il s'agit de Visio.



7
votes

Je giflé ensemble quelque chose rapidement en utilisant VB6, et vous pouvez le télécharger à l'adresse: http://fournier.jonathan.googlepages.com/Vis2Img.exe

juste passer le chemin du fichier de visio d'entrée, puis le chemin du fichier de sortie (exportations de visio basées sur l'extension de fichier) et éventuellement le numéro de page à l'exportation. p>

aussi est ici le code source je, si vous voulez mess avec elle ou le transformer en un VBScript ou quelque chose, il devrait fonctionner, mais vous auriez besoin pour terminer la conversion en code liaison tardive. p>

espoir qui aide, p>

Jon p>

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


3 commentaires

Je reçois un "Ce nom de fichier n'est pas valide." Num: -2032466859 Erreur lors de l'appel: "vis2img.exe dag.vsd dag.gif" de la ligne de commande. Ajout 0 ou 1 à la commande pour spécifier un numéro de page ne vous aide pas. Je vais regarder davantage quand je suis hors du travail. Merci pour un excellent point de départ au moins.


Oui, vous avez besoin le chemin complet de la façon dont cela est mis en place ... Vous pouvez ruser assez facilement à défaut juste app.path pour trouver le dossier pour un fichier, si un chemin complet n'est pas présent ...


Vis2img.exe " cygpath -w -a dag.vsd " " cygpath -w -a dag.gif " à la rescousse dans Cygwin Bash :). Merci Jon.



4
votes

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


2 commentaires

Si quelqu'un doit en avoir besoin, j'ai créé une version du script Powershell qui est disponible


Pour configurer la qualité de sortie, ce blog décrit les propriétés utiles et des méthodes accessibles à partir diagrammingApplication.Settings: developer.microsoft.com/en-us/visio/blogs/...



-1
votes

Vous pouvez essayer le convertisseur "Visio to Image"

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

Testé avec MS Visio 2007 et 2010


0 commentaires