Word-Dokument mittels VBA als PDF speichern (Integration in den Build-Prozess)

Eine Anwender-Dokumentation für ein Programm sollte im Idealfall nicht erst nach dem Fertigstellen des Programms erstellt werden, sondern mit dem Programm und seinen Features mitwachsen. Somit ist die Dokumentation (hier eher im Sinne von „Handbuch“ zu verstehen) eng mit der dazugehörigen Software verbunden. Daher ist es auch naheliegend, die Generierung der Anwender-Dokumentation in den Build-Prozess des Projekts mit einzubinden.

Im Folgenden wird davon ausgegangen, dass zur Erstellung der Anwender-Dokumentation Microsoft Word zum Einsatz kommt. Microsoft Office untersützt das Speichern von Dokumenten im PDF-Format ab Version 2010 (bei Office 2007 kann dieses Feature allerdings per Add-In nachgerüstet werden).

Der Artikel soll nun zeigen, wie man Word mittels VBA (Visual Basic for Applications) instrumentalisieren kann, damit die Erzeugung von PDF-Dokumenten einfach in den Build-Prozess mit Visual Studio integriert werden kann.

VBA-Skript zur Erzeugung von PDF-Dokumenten

Das folgende VBA-Skript sorgt dafür, dass Word-Dokumente (doc oder docx) als PDF abgespeichert werden:

' doc2pdf: creates a PDF file from a doc/docx document
'
' Usage: doc2pdf <input file (doc or docx)> <export file (PDF)>
' If the second parameter is not specified, the PDF file is generated in the folder of the doc/docx file and has the same name as the doc/docx file.
'
' Examples:
' doc2pdf C:\Test\MyDoc.docx c:\Test2\MyPdf.pdf - creates a MyPdf.pdf file in C:\Test2
' doc2pdf C:\Test\MyDoc.docx - Creates a MyDoc.pdf file in C:\Test
'

Const WdDoNotSaveChanges = 0
Const WdFormatPDF = 17

Dim args
Set args = WScript.Arguments

Dim doc
Dim pdf

Call CheckArgs()
Call DOC2PDF(doc, pdf)

Set args = Nothing

Function CheckArgs()
  If args.Unnamed.Count = 0 Then
    WScript.Quit 1
  ElseIf args.Unnamed.Count = 1 Then
	doc = args.Unnamed(0)
	pdf = ""
 ElseIf args.Unnamed.Count = 2 Then
	doc = args.Unnamed(0)
	pdf = args.Unnamed(1)
 Else
	WScript.Quit 1
  End If
End Function

Function Doc2Pdf(fileDoc, filePdf)
  Dim fso
  Dim word
  Dim wordDocument
  Dim wordDocuments
  Dim folder

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set word = CreateObject("Word.Application")
  Set wordDocuments = word.Documents

  fileDoc = fso.GetAbsolutePathName(fileDoc)
  folder = fso.GetParentFolderName(fileDoc)

  If Len(filePdf) = 0 Then
    filePdf = fso.GetBaseName(fileDoc) + ".pdf"
  Else
    If Not fso.FolderExists(fso.GetParentFolderName(filePdf)) Then
        fso.CreateFolder(fso.GetParentFolderName(filePdf))
    End If
  End If

  If Len(fso.GetParentFolderName(filePdf)) = 0 Then
    filePdf = folder + "\" + filePdf
  End If

  If fso.FileExists(filePdf) Then
    fso.DeleteFile(filePdf)
  End If

  Set wordDocument = wordDocuments.Open(fileDoc)
  wordDocument.SaveAs filePdf, WdFormatPDF
  wordDocument.Close WdDoNotSaveChanges
  word.Quit WdDoNotSaveChanges
  Set word = Nothing
  Set fso = Nothing
End Function

Integration in den Visual Studio Build-Prozess

Dieses Skript kann nun mühelos in den Build-Prozess von Visual Studio integriert werden.
Dazu fügt man es erst einmal Add > Exisiting Item… dem Projekt hinzu. Die Dokumentation ist der Einfachkeit halber ebenfalls Teil des Visual Studio-Projekts.

Als nächstes öffnet man die Projekt-Eigenschaften (des Projekts, in dem das Word-Dokument nebst VBA-Skript enthalten sind) und wechselt in die Tabe Build Events. Hier wird der Aufruf des VBA-Skripts folgendermaßen als Post-build event eingetragen:

"$(ProjectDir)doc2pdf.vbs" "$(ProjectDir)MyDocumentation.docx" "$(TargetDir)MyDocumentation.pdf"

 

Post-build event
Post-build event

Sowohl das Skript (doc2pdf.vbs), als auch die Dokumentation (MyDocumentation.docx) liegen hierbei im Root-Verzeichnis des Visual Studio-Projekts.

Nun erhält man beim Bauen des Projekts im Output-Verzeichnis die Dokumentation als PDF-Datei.

Einschränkungen

Bei der hier gezeigten Vorgehensweise gibt es lediglich eine Einschränkung: Das Dokument, welches in eine PDF-Datei umgewandelt werden soll, darf nicht gleichzeitig in Word geöffnet sein. Ansonsten schlägt die Umwandlung fehl und eine „verwaiste“ Instanz von Word (d.h. ohne Benutzeroberfläche) bleibt zurück. Diese muss in diesem Fall dann mittels Taskmanager beendet werden.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert