COM-Add-In für Word: PDF-Export

Nachdem wir bereits gezeigt haben, wie man COM-Add-Ins für die Verwendung in anderen Office-Anwendungen nutzen kann, wollen wir nun auch einmal eines für Word programmieren. Die Aufgabe lautet, die verschiedenen Funktionen, die wir im Artikel “Word: PDF per VBA erzeugen” definiert haben, in Word für alle Dokumente bereitzustellen. Dazu erstellen wir ein neues COM-Add-In mit der Entwicklungsumgebung twinBASIC. Das COM-Add-In soll seine Funktionen per Ribbon bereitstellen, sodass der Benutzer mit wenigen Mausklicks die gewünschten Exporte erzeugen kann. Dazu gehört der Export des vollständigen Dokuments, aller Seiten einzeln, eines bestimmten Bereichs, der aktuellen Seite oder auch von Bereichen, die durch bestimmte Formatierungen eingeleitet werden.

Im Artikel Word: PDF per VBA erzeugen (www.vbentwickler.de/384) haben wir einige Methoden gezeigt, wie wir den Inhalt von Word-Dokumenten in PDF-Dokumente exportieren können. Diese sehen wie folgt aus:

  • Komplettes Dokument als PDF speichern
  • Jede Seite als eigenes PDF-Dokument extrahieren
  • Bereiche nach Seitenzahl exportieren
  • Exportieren der aktuellen Seite
  • Aufteilen nach Eigenschaften wie Überschriften
  • Speichern des markierten Textes in ein eigenes PDF-Dokument

Diese Funktionen wollen wir nun in ein COM-Add-In integrieren, das die Funktionen für alle Dokumente in einem eigenen Tab im Ribbon anzeigt (siehe Bild 1). Hier sehen wir auch die Möglichkeit, die Seitenzahlen zum Exportieren eines Bereichs zu exportieren. Außerdem können wir angeben, ob das PDF nach dem Export direkt geöffnet werden soll.

Das Ribbon-Tab für die Exportfunktionen

Bild 1: Das Ribbon-Tab für die Exportfunktionen

Voraussetzungen

COM-Add-Ins wie dieses erstellen wir mit dem Tool twinBASIC, das für die Erstellung von 32-Bit-Anwendungen kostenlos verfügbar ist. Mehr dazu findest Du in Artikeln wie twinBASIC: Visual Basic für die Zukunft (www.vbentwickler.de/310) und COM-Add-Ins mit twinBASIC (www.vbentwickler.de/311).

Da dort die Basics zum Erstellen von COM-Add-Ins bereits ausführlich dokumentiert wurden, konzentrieren wir uns hier auf die für unseren Anwendungszweck spezifischen Teile der Programmierung.

Starten des COM-Add-Ins

Beim Starten des COM-Add-Ins wird die Methode OnConnection der Schnittstelle IDTExtentibility2 aufgerufen (siehe Listing 1).

Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, ByVal AddInInst As Object, _
         ByRef custom As Variant()) Implements IDTExtensibility2.OnConnection
     Set objWord = Application
     Set objWordEvents = Application
End Sub

Listing 1: Diese Prozedur wird beim Starten von Word aufgerufen

Diese dient normalerweise dazu, einer Objektvariablen wie der folgenden einen Verweis auf die Anwendung hinzuzufügen, die das Add-In aufgerufen hat, in diesem Fall Word.Application. Diese landet in einem Standardmodul namens mdlWord.twin, weil wir von verschiedenen Modulen aus auf diese Variable zugreifen wollen:

Public objWord As Word.Application

Andererseits benötigen wir in diesem Fall aber auch die Möglichkeit, beim Öffnen eines neuen Dokuments oder beim Wechseln zu einem anderen Dokument auf das entsprechende Ereignis zu reagieren. Das ist notwendig, weil wir in die beiden Felder Erste Seite und Letzte Seite des Ribbons die erste und die letzte Seite des aktuellen Dokuments eintragen wollen. Dazu deklarieren wir also noch eine Variable namens objWordEvents, diesmal mit dem Schlüsselwort WithEvents:

Private WithEvents objWordEvents As Word.Application

Diese füllen wir und gleichzeitig implementieren wir die beiden Ereignisse DocumentOpen und DocumentChange für diese Variable:

Private Sub objWordEvents_DocumentOpen(ByVal Doc As _
         Word.Document)
     RibbonAktualisieren
End Sub
     
Private Sub objWordEvents_DocumentChange()
     RibbonAktualisieren
End Sub

Beide rufen die folgende Prozedur auf, welche das aktuelle Dokument referenziert, sofern dieses überhaupt vorhanden ist. Dann ermitteln wir die erste und die letzte Seite und schreiben diese in die Variablen lngErsteSeite und lngLetzteSeite. Diese Variablen deklarieren wir wiederum im Standardmodul mdlWord.twin.

Schließlich rufen wir die Invalidate-Methode der mit objRibbon referenzierten Ribbon-Definition auf, damit diese die anzuzeigenden Werte mit den entsprechenden get…-Callbackfunktionen erneut aufruft:

Private Sub RibbonAktualisieren()
     Dim objDocument As Word.Document
     If Not objRibbon Is Nothing Then
         On Error Resume Next
         Set objDocument = objWord.ActiveDocument
         On Error GoTo 0
         If Not objDocument Is Nothing Then
             lngErsteSeite = 1
             lngLetzteSeite = objWord.ActiveDocument. _
                 ComputeStatistics(wdStatisticPages)
             objRibbon.Invalidate
         End If
     End If
End Sub

Ribbon des COM-Add-Ins definieren

Damit kommen wir zu einem wichtigen Element, nämlich der Schnittstelle zum Aufrufen der Funktionen des COM-Add-Ins. Diese definieren wir in der Funktion GetCustomUI, die beim Starten von Word automatisch aufgerufen wird. Hier setzen wir in der Variablen strXML die Ribbon-Definition zusammen und geben diese dann zurück (siehe Listing 2).

Private Function GetCustomUI(ByVal RibbonID As String) As String Implements IRibbonExtensibility.GetCustomUI
     Dim strXML As String
     strXML &= "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" loadImage=""loadImage" _
         & """ onLoad=""onLoad"">" & vbCrLf
     strXML &= "  <ribbon startFromScratch=""false"">" & vbCrLf
     strXML &= "    <tabs>" & vbCrLf
     strXML &= "      <tab id=""tab"" label=""amvWordPDFExport"">" & vbCrLf
     strXML &= "        <group id=""grp"" label=""amvWordPDFExport"">" & vbCrLf
     strXML &= "          <button id=""btnExportKomplett"" size=""large"" label=""Komplett exportieren"" image=" _
         & """word_pdf_book.ico"" onAction=""onAction""/>" & vbCrLf
     strXML &= "          <button id=""btnExportEinzelneSeiten"" size=""large"" label=" _
         & """Alle Seiten einzeln exportieren"" image=""word_book_pdfs.ico"" onAction=""onAction""/>" & vbCrLf
     strXML &= "          <button id=""btnExportAktuelleSeite"" size=""large"" label=""Aktuelle Seite exportieren"" " _
         & "image=""word_pdf.ico"" onAction=""onAction""/>" & vbCrLf
     strXML &= "          <button id=""btnExportAktuelleMarkierung"" size=""large"" label=" _
         & """Aktuelle Markierung exportieren"" image=""word_pdf_range.ico"" onAction=""onAction""/>" & vbCrLf
     strXML &= "          <separator id=""sep1""/>" & vbCrLf
     strXML &= "          <editBox id=""txtErsteSeite"" label=""Erste Seite"" onChange=""onChange"" getText=" _
         & """getText""/>" & vbCrLf
     strXML &= "          <editBox id=""txtLetzteSeite"" label=""Letzte Seite"" onChange=""onChange"" getText=" _
         & """getText""/>" & vbCrLf
     strXML &= "          <button id=""btnExportBereich"" size=""large"" label=""Bereich exportieren"" image=" _
         & """word_pdf_pages.ico"" onAction=""onAction""/>" & vbCrLf
     strXML &= "          <checkBox id=""chkOeffnen"" label=""PDF nach Erstellen öffnen"" getPressed=" _
         & """GetPressedCheckBox"" onAction=""onActionCheckBox""/>" & vbCrLf
     strXML &= "        </group>" & vbCrLf
     strXML &= "      </tab>" & vbCrLf
     strXML &= "    </tabs>" & vbCrLf
     strXML &= "  </ribbon>" & vbCrLf
     strXML &= "</customUI>" & vbCrLf
     Return strXML
End Function

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar