2009-07-17 37 views
7

Tại nơi làm việc, chúng tôi sử dụng bản vẽ Visio khá rộng rãi làm hỗ trợ cho tài liệu. Thật không may là các tệp vsd không chơi độc đáo với các công cụ khai thác tài liệu hoặc wiki của chúng tôi như javadoc, doxygen hoặc naturaldocs. Mặc dù có thể chuyển đổi tệp Visio thành hình ảnh theo cách thủ công, nhưng nó chỉ là một rắc rối để giữ hình ảnh hiện tại và các tệp hình ảnh bị ràng buộc để lỗi thời. Và chúng ta hãy đối mặt với nó: Có các tập tin được tạo ra trong kiểm soát sửa đổi cảm thấy rất sai.Visio để chuyển đổi dòng lệnh hình ảnh

Vì vậy, tôi đang tìm một công cụ dòng lệnh có thể chuyển đổi tệp vsd thành jpeg, png, gif hoặc bất kỳ hình ảnh nào có thể được chuyển đổi thành hình ảnh mà trình duyệt có thể hiển thị. Tốt hơn là nó sẽ chạy dưới Unix, nhưng các cửa sổ cũng tốt. Tôi có thể xử lý phần còn lại của chuỗi tự động, công việc cron, hình ảnh sang chuyển đổi hình ảnh và ssh, scp, nhiều tệp, v.v.

Và đó là lý do tôi chuyển sang bạn: Tôi không thể tìm thấy công cụ như vậy. Tôi không nghĩ rằng tôi thậm chí có thể trả tiền cho một công cụ như vậy. Google-fu của tôi có hoàn toàn không? Bạn có thể giúp tôi được không?

Ý tôi là, nó phải có khả năng. Có phải là một cách để móc vào Visio với COM và làm cho nó để tiết kiệm như hình ảnh. Tôi đang sử dụng Visio 2007 bằng cách này.

Xin cảm ơn trước.

Trả lời

7

tôi tát một cái gì đó với nhau một cách nhanh chóng sử dụng VB6, và bạn có thể tải nó tại địa chỉ: http://fournier.jonathan.googlepages.com/Vis2Img.exe

Bạn chỉ cần vượt qua trong các đường dẫn tập tin Visio đầu vào, sau đó các đường dẫn tập tin đầu ra (xuất khẩu Visio dựa trên phần mở rộng tập tin), và tùy chọn số trang cần xuất. Ngoài ra ở đây là mã nguồn tôi sử dụng, nếu bạn muốn gây rối với nó hoặc biến nó thành một VBScript hoặc một cái gì đó, nó sẽ làm việc, mặc dù bạn sẽ cần phải hoàn thành chuyển đổi nó để mã bị ràng buộc muộn.

hy vọng rằng sẽ giúp,

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

Tôi nhận được "Tên tệp này không hợp lệ.Lỗi "NUM: -2032466859 khi gọi:" Vis2Img.exe DAG.vsd DAG.gif "từ dòng lệnh. Thêm 0 hoặc 1 vào lệnh để chỉ định số trang không giúp được gì. Tôi sẽ xem xét kỹ hơn khi –

+0

Vâng, bạn cần có đường dẫn đầy đủ theo cách này được thiết lập ... Bạn có thể tinh chỉnh nó khá dễ dàng để chỉ mặc định để app.path để tìm thư mục cho một tệp, nếu không có đường dẫn đầy đủ ... –

+0

Vis2Img.exe "' cygpath -w -a DAG.vsd' "" 'cygpath -w -a DAG.gif'" để giải cứu trong cygwin bash :). Cảm ơn Jon –

-2

Phải có cách để nối vào Visio bằng COM và làm cho nó lưu dưới dạng hình ảnh.

Tại sao bạn không thử viết một thứ gì đó, sau đó, nếu bạn biết cách sử dụng công cụ COM? Sau khi tất cả, nếu bạn không thể tìm thấy bất cứ điều gì đã được thực hiện để làm điều đó, và bạn biết bạn có thể tìm ra cách để làm điều đó cho mình, tại sao không viết một cái gì đó để làm điều đó cho mình?

EDIT: Xây dựng một chút về những gì tôi đã nêu trong bình luận của mình: viết một kịch bản nào đó có vẻ là lựa chọn tốt nhất của bạn trong tình huống này, và ít nhất, Python sẽ khá hữu ích cho việc đó thư viện tìm thấy ở đây: http://starship.python.net/crew/theller/comtypes/ Tất nhiên, như tôi đã nói, nếu bạn thích sử dụng một ngôn ngữ kịch bản khác, thì bạn có thể thử sử dụng nó; vấn đề là, tôi đã thực sự sử dụng COM với VBA và Python tại thời điểm này (như một sang một bên, Microsoft có xu hướng đề cập đến "Tự động hóa" những ngày này chứ không phải là đặc biệt tham khảo COM, tôi tin.) Điều tốt đẹp về Python là đó là một ngôn ngữ diễn giải, và do đó bạn chỉ cần một phiên bản của thông dịch viên cho các hệ điều hành khác nhau mà bạn đang sử dụng, với các phiên bản cho Windows, OSX, Linux, Unix, vv Mặt khác, tôi nghi ngờ bạn có thể sử dụng COM trên không Các hệ thống -Windows không có một số loại hack, vì vậy bạn có thể phân tích dữ liệu trong các tệp nguồn trực tiếp (và mặc dù các định dạng mặc định của Visio xuất hiện để sử dụng một dạng XML nào đó, nó có thể là một trong những định dạng sở hữu độc quyền đó.).

Nếu bạn chưa sử dụng Python trước, các tài liệu Python có một hướng dẫn tốt để mọi người bắt đầu: http://docs.python.org/3.1/tutorial/index.html

Và, tất nhiên, bạn sẽ muốn trình thông dịch Python bản thân: http://python.org/download/releases/3.1/ (Lưu ý rằng bạn có thể phải tự thêm thư mục Python vào biến môi trường PATH sau khi cài đặt.)

Khi bạn viết tập lệnh, bạn có thể có cú pháp để chạy tập lệnh giống như "python visioexport.py <source/original file[ with path]>[ <new file[ with path]>]" (giả sử tệp tập lệnh nằm trong Thư mục Python), với tập tin mới mặc định cho một tập tin cùng tên và trong cùng thư mục/thư mục với tên gốc nó với một phần mở rộng khác; trên thực tế, nếu bạn muốn, bạn có thể thiết lập để xuất sang nhiều định dạng, với định dạng mặc định là bất kỳ tiện ích mở rộng mặc định nào bạn chọn và được chỉ định bởi tiện ích mở rộng thay thế của bạn chỉ định một trong tên tệp.Đồng thời, bạn có thể thiết lập nó để nếu bạn chỉ có tên tệp mới sau tệp nguồn, không có đường dẫn nào được chỉ định, nó sẽ lưu với tên tệp mới đó vào thư mục của tệp nguồn. Và, tất nhiên, nếu bạn không chỉ định đường dẫn cho tệp nguồn, chỉ cần tên tệp, bạn có thể thiết lập để lấy tệp từ thư mục hiện tại).

Về chủ đề định dạng tệp: dường như tôi chuyển đổi sang SVG có thể là điều tốt nhất để làm, vì nó sẽ tiết kiệm không gian hơn và phản ánh tốt hơn trạng thái của hình ảnh gốc dưới dạng hình ảnh vectơ. Mặt khác, việc chuyển đổi từ định dạng Visio sang SVG không hoàn hảo (hoặc ít nhất, nó không có trong Visio 2003; tôi không thể tìm thấy nguồn thông tin tương tự như this one cho Visio 2007), và như đã thấy here, bạn có thể phải sửa đổi tệp XML kết quả (mặc dù điều đó có thể được thực hiện bằng cách sử dụng tập lệnh, sau khi tệp được xuất, qua các phần của thư viện chuẩn Python). Nếu bạn không nhớ kích thước tệp bổ sung của bitmap và bạn không muốn bao gồm mã bổ sung để sửa các tệp SVG kết quả, thì có thể bạn chỉ cần đi với định dạng bitmap chẳng hạn như PNG.

+0

Trong khi tôi biết C, một số C++ và một số C# Tôi khá xa hiểu toàn bộ phần mềm và tôi phải dành một chút thời gian để tìm hiểu nó, thiết lập môi trường ở nhà (vì nếu tôi tạo ứng dụng trên laptop của công ty, thì chương trình sẽ thuộc về công ty của tôi), tìm đúng phương thức cuộc gọi, đảm bảo rằng nó chơi tốt với XP và Vista, tạo trang web để những người khác có thể sử dụng nó, v.v. Có rất nhiều chi phí trong chương trình nhỏ này và tôi hy vọng rằng ai đó đã trả tiền cho nó với thời gian của mình để tôi có thể trả tiền bằng tiền thay vào đó. Bây giờ tôi phải làm điều đó ... –

+0

Tôi xin lỗi vì thời gian chờ đợi, và thấy kỳ lạ là không ai khác đã cung cấp câu trả lời. Bất kể, tôi khuyên bạn nên kiểm tra Python và thư viện comtypes có sẵn; nó cung cấp một ràng buộc Python rất tốt đẹp cho COM API, và dễ dàng hơn nhiều để làm việc với hơn bằng cách sử dụng COM với C, C++, hoặc C# sẽ được. Tôi sẽ tự mình thử nghiệm với Visio, nhưng tôi không có bản sao Visio. – JAB

+0

Quên đề cập: Ngay cả khi bạn không biết Python, cũng không mất quá nhiều thời gian để học và làm quen với nó; cũng như, nếu có một số ngôn ngữ kịch bản khác mà bạn thích, bạn có thể có thể kiểm tra xem có một số loại COM ràng buộc thư viện/add-in cho rằng là tốt. – JAB

2

F # 2.0 kịch bản:

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

Nếu có ai cần nó, tôi đã tạo phiên bản Powershell của tập lệnh có sẵn [ở đây] (https://gist.github.com/ap0llo/1e24d9e66ef58f5de064c8aba2198b9e) – Apollo

Các vấn đề liên quan