nhinkle
nhinkle

Reputation: 1157

Convert Microsoft Visio Drawing (vsd) to PDF automatically

An open-source project I am working on uses Visio drawings for documentation, which are checked into source control. For those working on the project who don't own Visio, we have been converting the vsd files to PDFs so that they can still view them. It's not too difficult to save a copy as a PDF when making changes to the documentation, but we would like an automated way to do this conversion, so that we can set it up as a pre-checkin script in the SVN client. If anybody knows of a way to do this, either using something built-in to Visio, or with an outside script or command line tool, we would appreciate it.

Edit: Thanks to the suggestion below, I have found the Visio Viewer 2010. This will be helpful for our contributors using Windows. We would still like to have the ability to create PDFs though, as there are readers available on every major operating system, and our contributors will not be using only Windows.

Upvotes: 6

Views: 17711

Answers (5)

The Compiler
The Compiler

Reputation: 11939

I wrote a small Python script to do this:

import pathlib
import sys
import win32com.client


def set_ps(page, cell, value):
    page.PageSheet.Cells(cell).Formula = value


def convert(visio, path, out_path):
    doc = visio.Documents.Open(str(path))

    for page in doc.Pages:
        set_ps(page, "PageLeftMargin", "0mm")
        set_ps(page, "PageRightMargin", "0mm")
        set_ps(page, "PageTopMargin", "0mm")
        set_ps(page, "PageBottomMargin", "0mm")
        page.ResizeToFitContents()

    pdf_format = 1
    intent_print = 1
    print_all = 0
    doc.ExportAsFixedFormat(pdf_format, out_path, intent_print, print_all)
    doc.Close()


def main():
    visio = win32com.client.Dispatch("Visio.Application")
    visio.AlertResponse = 7  # Answer "no" to all save dialogs

    basedir = pathlib.Path(sys.argv[1])
    files = list(basedir.glob('*.vsdx'))
    for i, path in enumerate(files, start=1):
        print(f"[{i:3}/{len(files):3}] {path.stem}")
        out_path = path.with_suffix(path.suffix + '.pdf')
        if out_path.exists():
            continue
        convert(visio, path, out_path)


if __name__ == '__main__':
    main()

You'll need Python and the pywin32 library, then run it with a path to a folder containing .vsdx files. It might work with .vsd as well, though I didn't test that.

Upvotes: 0

Christian Tremblay
Christian Tremblay

Reputation: 839

This project is really cool : https://github.com/cognidox/OfficeToPDF

Super easy to integrate to a Python process task. The compiled version (OfficeToPDF.exe) is provided.

Upvotes: 1

Steffen Macke
Steffen Macke

Reputation: 1146

You could use vsd2svg and svg2pdf for the conversion process - if you would like to do it on the commandline. Or the underlying libraries.

http://dia-installer.de/vsd2svg

http://cgit.freedesktop.org/~cworth/svg2pdf/

Upvotes: 2

till
till

Reputation: 610

I found this nice vbs script and adapted it to visio.It can be called via cygwin (works for all kind of Office stuff)

 Option Explicit

Main()

Sub Main()
  If WScript.Arguments.Count > 0 Then 
      Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
      Dim i
      For i = 0 to wscript.arguments.count - 1
          Dim strFilePath : strFilePath = WScript.Arguments.Item(i)
          Dim dirPath : dirPath = objFSO.GetParentFolderName(strFilePath)
          Dim fileBaseName : fileBaseName = objFSO.GetBaseName(strFilePath)
          'WScript.Echo strFilePath
          Dim strNewFileName : strNewFileName = dirPath & "\" & fileBaseName & ".pdf"
          'WScript.Echo strNewFileName
          Dim strFileExt : strFileExt = UCase(objFSO.GetExtensionName(strFilePath))
          Select Case strFileExt
              Case "DOC"
                  DOC2PDF strFilePath, strNewFileName
              Case "XLS"
                  XLS2PDF strFilePath, strNewFileName
              Case "PPT"
                  PPT2PDF strFilePath, strNewFileName
              Case "VSD"
                  VSD2PDF strFilePath, strNewFileName
              Case Else
                  WScript.Echo "Extension Type:  " & strFileExt
          End Select
      Next
  Else
      msgbox("Sie muessen eine Datei zum konvertieren auswählen.")
  End If
End Sub

Sub PPT2PDF(strSourceFile, strDestFile)
  Const ppWindowMinimized = 2
  Const ppWindowNormal = 1
  Const ppSaveAsPDF = 32

  Dim objPPT : Set objPPT = CreateObject("PowerPoint.Application")
  objPPT.Visible = True
  objPPT.WindowState = ppWindowMinimized
  objPPT.Presentations.Open strSourceFile
  objPPT.ActivePresentation.SaveAs strDestFile, ppSaveAsPDF 
  objPPT.Quit()
End Sub

Sub DOC2PDF(strSourceFile, strDestFile)
  Const wdExportAllDocument = 0
  Const wdExportOptimizeForPrint = 0
  Const wdExportDocumentContent = 0
  Const wdExportFormatPDF = 17
  Const wdExportCreateHeadingBookmarks = 1

  Dim objWord : Set objWord = CreateObject("Word.Application")
  Dim objDoc : Set objDoc = objWord.Documents.Open(strSourceFile,,TRUE)    
  objWord.ActiveDocument.ExportAsFixedFormat strDestFile, wdExportFormatPDF, False, _
                  wdExportOptimizeForPrint, wdExportAllDocument,,, _
                  wdExportDocumentContent, False, True, wdExportCreateHeadingBookmarks
  objWord.Quit()
End Sub

Sub XLS2PDF(strSourceFile, strDestFile)
  Const xlTypePDF = 0

  Dim objExcel : Set objExcel = CreateObject("Excel.Application")
  Dim objeDoc : Set objeDoc = objExcel.Workbooks.Open(strSourceFile,,TRUE)    
  objExcel.ActiveWorkbook.ExportAsFixedFormat xlTypePDF, strDestFile
  objExcel.ActiveWorkbook.Close(False)
  objExcel.Quit
End Sub

Sub VSD2PDF(strSourceFile, strDestFile)
  Const xlTypePDF = 1
  Const visOpenRO = 2
  Const visOpenMinimized = 16
  Const visOpenHidden = 64
  Const visOpenMacrosDisabled = 128
  Const visOpenNoWorkspace = 256

  Dim objVisio : Set objVisio = CreateObject("Visio.Application")
  Dim objeDoc : Set objeDoc = objVisio.Documents.OpenEx(strSourceFile, visOpenRO + visOpenMinimized + visOpenHidden + visOpenMacrosDisabled + visOpenNoWorkspace)    
  objeDoc.ExportAsFixedFormat xlTypePDF, strDestFile, 1, 0
  objeDoc.Close
  objVisio.Quit
End Sub

Upvotes: 5

Jon Fournier
Jon Fournier

Reputation: 4327

Visio 2007 added the ExportAsFixedFormat method to the Visio API that will let you programmatically create a PDF file in Visio.

The tricky part is deploying the code in a way that makes sense for your project. You could create a stencil that just acts as an addon, and attach that stencil to all the Visio documents in your project. The code in the stencil would just watch the Visio application object for DocumentSaved events, and save a pdf of the document in the same folder.

Upvotes: 1

Related Questions