2009-07-17 20 views
7

作業時には、ドキュメントのサポートとしてVisio図面をかなり使用しています。残念ながら、vsdファイルは、javadoc、doxygen、naturaldocsなどのwikiやドキュメント抽出ツールでうまく動作しません。 Visioファイルを手動でイメージに変換することは可能ですが、イメージを最新の状態に保つのは単なる手間であり、イメージファイルの期限が切れています。そしてそれに直面しましょう:リビジョンコントロールでファイルを生成することは間違っているように感じます。Visioからイメージへのコマンドライン変換

私は、vsdファイルをjpeg、png、gif、またはブラウザが表示できる画像に変換できる画像に変換できるコマンドラインツールを探しています。好ましくは、UNIX上で動作しますが、ウィンドウだけでも問題ありません。私は残りのオートメーションチェーン、cronジョブ、イメージからイメージへの変換とssh、scp、複数のファイルなどを扱うことができます。

それで私はあなたに向かっています:そのようなツールは見つかりません。私はそのようなツールを支払うことさえできないと思います。私のGoogle-fuは完全にオフですか?手伝って頂けますか?

私はそれが可能でなければならないことを意味します。 COMを使用してVisioにフックし、イメージとして保存する方法が必要です。私はVisio 2007を使っています。

ありがとうございます。

答えて

7

私はVB6を使用してすぐに一緒に何かを平手打ち、そしてあなたがでそれをダウンロードすることができます。必要に応じて、出力ファイルパス(Visioの輸出は、ファイル拡張子に基づいて)と、あなただけの入力Visioファイルのパスを渡し http://fournier.jonathan.googlepages.com/Vis2Img.exe

エクスポートするページ番号。

また、私が使ったソースコードもあります。もしそれを混乱させたり、VBScriptなどに変換したりしたいのであれば、それは動作するはずですが、後でバインドされたコードに変換する必要があります。ジョン

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

COMでVisioにフックしてイメージとして保存する方法があります。

あなた自身で何かを書くことを試みてみませんか.COMの使い方を知っているのですか?結局のところ、あなたはそれをやるために何かを見つけることができない場合、あなたは自分自身でそれを行う方法を見つけることができることを知っている、あなたはそれを自分で行うために何かを書いてみませんか?

EDIT:私のコメントで述べたことをちょっと整理する:ある種のスクリプトを書くことはこの状況では最善の選択肢だと思われます。少なくともPythonは、comtypesライブラリはここにあります:http://starship.python.net/crew/theller/comtypes/もちろん、私が言ったように、あなたが別のスクリプト言語を使いたいなら、それを使ってみることができます。問題は、現時点ではVBAとPythonでCOMを実際に使用していることです(MicrosoftはCOMを具体的に参照するのではなく、最近「オートメーション」を参照する傾向があります)。Pythonに関する素晴らしい点は、それはインタープリター言語なので、使用しているOSごとにインタープリタのバージョンが必要です.Windows、OSX、Linux、Unixなどのバージョンがあります。 - Windowsシステムに何らかのハッキングがないため、ソースファイル内のデータを直接解析する必要があります(また、Visioのデフォルトの形式ではXML形式が使用されているように見えますが、Microsoftが愛用している独自の形式)。

あなたが前のPythonを使用していない場合は、Pythonドキュメントは、人々が始めるのに良いチュートリアルがあります:http://docs.python.org/3.1/tutorial/index.html

をそして、もちろん、あなたがPythonインタプリタ自体勧めします:http://python.org/download/releases/3.1/は(あなたは可能性があることに注意を

スクリプトを書くときには、おそらくスクリプトを実行するための構文を "python visioexport.py <source/original file[ with path]>[ <new file[ with path]>]"(スクリプトファイルがあなたのマシンにあると仮定して)にすることができます。これは、PATH環境変数に手動でPythonディレクトリを追加する必要があります。 Pythonディレクトリ)、新しいファイルはデフォルトで元のファイルと同じ名前の同じフォルダ/ディレクトリにあります(albeそれは異なる拡張子を持つ。実際には、望むなら、複数のフォーマットにエクスポートするように設定することができます。フォーマットは、デフォルトの拡張子をデフォルトとして使用し、ファイル名に代替拡張子で指定します。同様に、ソースファイルの後ろに新しいファイル名があっても、パスが指定されていない場合は、その新しいファイル名でソースファイルのディレクトリに保存されるように設定することができます。もちろん、ソースファイルのパスを指定しない場合は、ファイル名だけを設定して、現在のディレクトリからファイルを取得するように設定することもできます。

ファイル形式の話題:SVGへの変換はスペース効率が良く、元の画像の状態をベクター画像として反映しやすくなるため、SVGへの変換が最善の方法かもしれません。一方、Visio形式からSVGへの変換は完全ではありません(少なくとも、Visio 2003ではなく、Visio 2007の場合はthis oneに似た情報源を見つけることができません)。 hereの場合は、結果のXMLファイルを変更する必要があります(ただし、ファイルをエクスポートした後、スクリプトを使用してPython標準ライブラリの一部を使用して実行できます)。ビットマップの追加ファイルサイズに気にしないで、SVGファイルを修正するコードを追加する必要がない場合は、PNGなどのビットマップ形式を使用してください。

+0

私はC、いくつかのC++といくつかのC#を知っていますが、私はソフトウェアスタック全体を理解するのはかなり遠いので、かなり時間を掛けて、 (私の会社のラップトップでアプリケーションを作成すると、そのプログラムは私の会社に帰属するので)適切なメソッド呼び出しを見つけ、それがXPとVistaでちょっとうまくいくことを確認し、Webページを作成する他の人がそれを使うことができるようにします。この小さなプログラムにはオーバーヘッドがたくさんあります。その代わりに誰かがそれを支払って、お金で代金を支払うことができることを願っていました。今私はそれをする必要があります... –

+0

私は待ち時間のために謝罪し、誰も答えを提供していないことが奇妙に感じます。 にかかわらず、私はPythonと利用可能なcomtypesライブラリをチェックアウトすることをお勧めします。それはCOM APIのための非常に素晴らしいPythonバインディングを提供し、C、C++、またはC#でCOMを使用するよりもはるかに簡単です。私は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

誰かがそれを必要とする場合、私は利用可能な[ここ](https://gist.github.com/ap0llo/1e24d9e66ef58f5de064c8aba2198b9e)のPowershellバージョンを作成しました。 – Apollo

関連する問題