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"

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.