I had a project where I needed to draw a lot of UML diagrams, and decided on Microsoft Visio for the drawing work. The diagrams had to be included in various project outputs, such as a design report and a project wiki. This would require exporting files from Microsoft Visio to PNG format whenever a change was made to any diagram.

What I needed was a way to automate image export from Microsoft Visio. Since all the diagram files live in a single folder, a script would go through that folder, find all VSD (Visio) files, and export them to PNG.

Solution 1: using vsd2svg and ImageMagick

A free tool called vsd2svg allows us to convert any VSD file into SVG format. This worked fine for me, and I would be able to write a shell script to convert all VSD files automatically. However, I wasn’t happy with the SVG format – I wanted PNGs instead which would be nicely portable for different browsers viewing the wiki.

ImageMagick should help – it can convert SVG files into PNG. No such luck though. Although ImageMagick can do the conversion, in my case any texts were either missing or virtually unreadable. This may be linked to the use of an unknown font. However, my diagrams used Arial so that would hardly be an unknown font. ImageMagick may still work for you, though.

Solution 2: Visio Automation

Instead of using external tools, why not let Visio do all the work? Clearly I don’t want to click File -> Export -> PNG for each file in my list of diagrams, but Visio does produce excellent results when saving as PNG. The fonts are readable and Visio automatically crops any diagram to only the drawing area. Surrounding whitespace is removed.

It turns out that Visio can be automated to convert a group of VSD files to PNG in one go. This is done through same VBA scripting.

  • Create a new empty diagram in Visio, called “Exporter.vsd”.
  • Find the Developer Toolbar in Visio and click the “Visual Basic Editor” icon (ALT+F11 also works).

Add the following code:

	
Sub ExportPNGs()
  ' Define directory to work in:
  Dim directory As String
  directory = "c:\code\itc\diagrams"
  ' Gather .vsd files in directory:
  Dim files As New Collection
  Dim filename As String
  filename = Dir(directory & "*.vsd")
  ' File names are stored without their extension:
  Do While filename <> ""
    filename = Left(filename, InStrRev(filename, ".") - 1)
    If filename <> "Exporter" Then
      files.Add (filename)
    End If
    filename = Dir
  Loop
  For Each f In files
    ' Open document in visio:
    Dim doc As Document
    Set doc = Documents.Add(directory & "" & f & ".vsd")
    ' Export each page as PNG:
    Dim p As Page
    For Each p In doc.Pages
      Dim output As String
      output = directory & "" & f & "-" & p.Index & ".png"
      p.Export (output)
    Next
    doc.Close
  Next
End Sub

This code will:

  • Find all VSD files in the specified working directory and store them in a list (except for our file Exporter.vsd);
  • Find all pages within each file;
  • Export each page as a PNG file.

This macro can now be connected to a button on a toolbar, or simply executed from the Visual Basic editor. It will convert all VSD files to PNG files in one go. The resulting images can then immediately be uploaded to a web server for use in a wiki, or could be linked from a Word file.