Immer wieder erhalten wir Fragen danach, wie man PDF-Dokumente einfach in Access-Formularen anzeigen kann. Die einfachste Variante scheint die mit dem Web-Browser-Steuerelement zu sein, mit dem man zu einem auf der Festplatte befindlichen PDF-Dokument navigiert. Der vorliegende Beitrag zeigt nicht nur, wie Sie das Dokument anzeigen, sondern liefert auch noch einige Möglichkeiten für die Handhabung des PDF-Dokuments. Dazu gehören das Zoomen, Drucken, Einstellen verschiedener Ansichten und Layouts und vieles mehr.
Voraussetzungen
Die Lösung zu diesem Beitrag haben wir auf einem Rechner mit Windows 10, Office 365 und Adobe Acrobat Reader DC in der Version 2020.012.20041 entwickelt und getestet.
Wenn wir im WebBrowser-Steuerelement die Navigate2-Methode verwenden und als Parameter den Pfad zu einem PDF-Dokument angeben, wurde unter den oben genannten Voraussetzungen das angegebene PDF-Dokument innerhalb des Webbrowser-Steuerelements angezeigt – so, als ob Sie vom Internet Explorer aus ein PDF-Dokument öffnen.
Formular mit Webbrowser-Steuerelement anlegen
Die erste Aufgabe ist das Hinzufügen eines Web-Browser-Steuerelements zu einem neuen Access-Formular. Das Formular legen wir in der Beispieldatenbank unter dem Namen frmPDFImWebbrowser an.
Diesem fügen wir nun in der Entwurfsansicht ein Web-Browser-Steuerelement hinzu, das wir im Ribbon unter Entwurf|Steuerelemente|Webbrowsersteuerelement finden.
Nach dem Hinzufügen sieht das Steuerelement recht unscheinbar aus (siehe Bild 1). Für das neue WebBrowser-Steuerelement legen wir den Namen ctlWebbrowser fest.
Bild 1: Anlegen des WebBrowser-Steuerelements
Damit sich das WebBrowser-Steuerelement beim Vergrößern des Formulars mit vergrößert, stellen wir die beiden Eigenschaften Horizontaler Anker und Vertikaler Anker auf den Wert Beide ein.
Damit keine unnötigen Elemente im Formular angezeigt werden, legen wir außerdem für die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Bildlaufleisten und Trennlinien den Wert Nein fest.
Schaltfläche zum Öffnen eines PDF-Dokuments
Nun beginnen wir mit den Elementen, die wir für das Öffnen eines PDF-Dokuments im WebBrowser-Steuerelement benötigen. Dazu fügen wir eine einfache Schaltfläche namens cmdPDFOeffnen hinzu.
Für diese hinterlegen wir die folgende Ereignisprozedur:
Private Sub cmdPDFOeffnen_Click() Dim strPDF As String strPDF = CurrentProject.Path & " est.pdf" Me!ctlWebbrowser.Object.Navigate strPDF End Sub
PDF anzeigen
Der erste Wechsel in die Formularansicht ist ernüchternd: Das WebBrowser-Steuerelement zeigt lediglich eine Meldung über eine ungültige Adresse an (siehe Bild 2).
Bild 2: WebBrowser-Steuerelement ohne Inhalt
Das ändert sich allerdings nach einem Klick auf die Schaltfläche cmdPDFOeffnen. Das WebBrowser-Steuerelement zeigt dann wie in Bild 3 das gewünschte PDF-Dokument an.
Bild 3: PDF-Document im WebBrowser-Steuerelement
Leeres Browserfenster anzeigen
Wir wollen dem Benutzer beim Öffnen des Formulars nicht die Meldung über die ungültige Adresse präsentieren, sondern ein leeres Browser-Fenster. Dabei erledigen wir direkt ein paar Vorarbeiten für die folgenden Schritte. Als Erstes fügen wir dem Klassenmodul des Formulars ganz oben die folgende Deklaration einer Variablen für das Webbrowser-Element hinzu. Dieses statten wir mit dem Schlüsselwort WithEvents aus, damit wir seine Ereignisse im Klassenmodul implementieren können. Eines davon benötigen wir nämlich:
Dim WithEvents objWebbrowser As WebBrowser
Danach implementieren wir eine Ereignisprozedur für das Ereignis Beim Laden des Formulars. Hier füllen wir direkt die Variable objWebBrowser mit dem Element, das in der Eigenschaft Object des WebBrowser-Steuerelements steckt. Der Hintergrund ist, dass das von uns hinzugefügte Access-Steuerelement nur ein Wrapper für das eigentliche WebBrowser-Steuerelement ist, der einige Eigenschaften und Ereignisse zur Verfügung stellt.
Wir benötigen aber auch beispielsweise ein Ereignis, das dieser Wrapper nicht bereithält. Also greifen wir mit Me!ctlWebbrowser.Object auf das darin enthaltenen WebBrowser-Steuerelement zu:
Private Sub Form_Load() Set objWebbrowser = Me!ctlWebbrowser.Object
Anschließend verwenden wir die Navigate2-Methode, um zu einer Seite namens about:blank zu navigieren. Danach zeigt das WebBrowser-Steuerelement statt der Seite mit der Meldung eine leere Seite an:
objWebbrowser.Navigate2 "about:blank"
End Sub
PDF auswählen
Das Laden des PDF-Dokuments wollen wir noch ein wenig eleganter gestalten, denn schließlich wollen wir nicht immer das gleiche PDF-Dokument laden, sondern dem Benutzer auch die Möglichkeit geben, dieses auszuwählen.
Dazu fügen wir im oberen Bereich ein Textfeld namens txtPDFDocument hinzu. Die Schaltfläche cmdPDFOeffnen statten wir mit drei Punkten als Text aus, sodass der obere Teil des Formulars nun wie in Bild 4 aussieht.
Bild 4: Steuerelemente zum Auswählen des anzuzeigenden PDF-Dokuments
Die Prozedur, die durch diese Schaltfläche ausgelöst wird, ändern wir wie folgt:
Private Sub cmdPDFOeffnen_Click() Dim strPDF As String strPDF = OpenFileName(CurrentProject.Path, _ "PDF auswählen", "PDF-Dokumente (*.pdf)") Me!txtPDFDokument = strPDF objWebbrowser.Navigate2 strPDF End Sub
Damit können wir das PDF-Dokument nun mit einem Dateiauswahl-Dialog öffnen.
Programmierung der PDF-Ansicht
Die PDF-Ansicht des Acrobat-Readers im WebBrowser-Steuerelement bietet einige Möglichkeiten zum Anzeigen von Seiten, Drucken des Dokuments oder zum Einstellen der verschiedenen Ansichten. Hier ist eine Übersicht der nachfolgend vorgestellten Methoden:
- gotoFirstPage: Navigiert zur ersten Seite des Dokuments.
- gotoPreviousPage: Navigiert zur vorherigen Seite des Dokuments.
- gotoNextPage: Navigiert zur nächsten Seite des Dokumetns.
- gotoLastPage: Navigiert zur letzten Seite des Dokuments.
- setCurrentPage: Zeigt die Seite mit der als Parameter angegebenen Seitennummer an.
- setLayoutMode: Stellt das Layout auf einen der folgenden Werte ein, den Sie als Parameter bei Aufruf übergeben: DontCare – verwendet die aktuellen Einstellungen, SinglePage – zeigt eine einzelne Seite an, OneColumn: zeigt jeweils eine Seite an, Two-ColumnLeft – zeigt zwei Seiten nebeneinander an, wobei die erste Seite auf der linken Seite beginnt (das heißt, Seite eins und zwei erscheinen ganz oben), Two-ColumnRight – zeigt ebenfalls zwei Seiten nebeneinander an, aber in der obersten Reihe erscheint nur die erste Seite, und zwar rechts.
- setPageMode: Stellt den Seitenmodus auf einen der folgenden Werte ein, den Sie als Parameter beim Aufruf der Methode übergeben: none – zeigt das Dokument ohne Lesezeichen oder Thumbnails an (Standardeinstellung), bookmarks – zeigt das Dokument und Lesezeichen an, thumbs – zeigt das Dokument und Thumbnails an.
- setView: Stellt die Ansicht ein und erwartet zum Beispiel einen der folgenden Werte als Parameter: Fit – passt die Seite so in das Steuerelement ein, dass es sowohl horizontal als auch vertikal hineinpasst, FitH – passt die Seitenbreite so an, dass die Seite horizontal in das Steuerelement hineinpasst, FitV – passt die Seitenhöhe so an, dass die Seite vertikal in das Steuerelement passt, FitB – passt die Seite ebenfalls horizontal und vertikal an das Steuerelement an.
- setShowScrollbars: Erwartet einen Boolean-Wert als Parameter, der angibt, ob die Bildlaufleisten angezeigt werden sollen oder nicht.
- setShowToolbar: Erwartet einen Boolean-Wert als Parameter, der angibt, ob die Menüleiste angezeigt werden soll oder nicht.
- LoadFile: Lädt das als Parameter angegebene PDF-Dokument und zeigt es an. Dies funktioniert allerdings erst, wenn das WebBrowser-Steuerelement bereits ein PDF-Dokument anzeigt und die Variable mit dem Verweis auf das PDF-Objekt gefüllt ist.
- printAll: Druckt den kompletten Inhalt des Dokuments, ohne einen Drucken-Dialog anzuzeigen.
- printAllFit: Druckt den kompletten Inhalt des Dokuments und erwartet einen Boolean-Wert als Parameter, der angibt, ob die PDF-Seite in den bedruckbaren Bereich des Druckers eingepasst werden soll.
- printWithDialog: Soll einen Drucken-Dialog öffnen, mit dem der Benutzer selbst die Druck-Einstellungen festlegen kann. Der Drucken-Dialog wurde unter unserer Konfiguration allerdings nicht angezeigt.
- printPages: Erwartet zwei Parameter, die angeben, welche die erste und welche die letzte zu druckende Seite ist. Bleibt einer dieser Parameter leer, wird die erste beziehungsweise letzte Seite angenommen.
- printPagesFit: Erwartet drei Parameter, von denen die ersten beiden angeben, welche die erste und die letzte zu druckende Seite ist. Der dritte Parameter legt fest, ob die PDF-Seite in den bedruckbaren Bereich des Druckers eingepasst werden soll. Bleiben der erste oder zweite Parameter leer, verwendet die Methode die erste oder letzte Seite des Dokuments als Werte.
- src: Eine der wenigen Eigenschaften des Objekts. Hiermit können Sie den Pfad zum aktuell angezeigten PDF-Dokument ermitteln.
- setZoom: Erwartet einen Parameter, der angibt, welcher Zoom-Faktor eingestellt werden soll. Der Wert 100 entspricht 100%.
- setZoomScroll: Erwartet drei Parameter. Der erste Parameter gibt wie bei setZoom den Zoom-Faktor an. Der zweite und dritte Parameter geben an, wie weit vom oberen oder linken Rand nach unten beziehungsweise rechts gescrollt werden soll. Dies hat für uns nur für die vertikale Komponente funktioniert.
PDF-Funktionen in das Formular integrieren
Nun fügen wir dem Formular einige Steuerelemente hinzu, mit denen wir die zuvor beschriebenen Methoden auf das aktuell angezeigte PDF-Dokument anwenden können.
Dazu müssen wir allerdings zunächst noch einen Verweis auf die Bibliothek mit den Methoden hinzufügen und das geladene PDF-Dokument mit einer Variablen referenzieren.
Verweis auf die Acrobat-Bibliothek
Den Verweis fügen Sie wie üblich über den Verweise-Dialog hinzu, den Sie mit dem Menüeintrag Extras|Verweise des VBA-Editors öffnen. Hier sollten Sie einen Eintrag mit dem Text Adobe Acrobat Browser Control Type Library 1.0 finden und hinzufügen (siehe Bild 5).
Bild 5: Verweis auf die Bibliothek Adobe Acrobat Browser Control Type Library 1.0
Anschließend finden Sie im Objektkatalog alle Methoden des Objekts AcroPDF. Dazu wählen Sie im Kombinationsfeld oben links den Eintrag AcroPDFLib aus und klicken dann in der Liste der Klassen auf den Eintrag AcroPDF (siehe Bild 6).
Bild 6: Die Klasse AcroPDF im Objektkatalog
Objektvariable für das AcroPDF-Objekt
Damit wir die Methoden des AcroPDF-Objekt komfortabel nutzen können, deklarieren wir dafür eine passende Objektvariable:
Dim objAcrobat As AcroPDFLib.AcroPDF
Wann aber füllen wir diese Variable Wir können das noch nicht in dem Moment erledigen, wo wir das Formular öffnen, denn dann ist noch kein PDF-Dokument im WebBrowser-Steuerelement enthalten und somit auch nicht das PDF-Steuerelement.
Wir können die Variable objAcrobat erst füllen, wenn der Benutzer das erste PDF-Dokument geladen hat. Wir wissen zwar, wann der Ladevorgang des PDF-Vorgangs beginnt – nämlich nachdem das WebBrowser-Steuerelement die Navigate2-Methode ausgeführt hat:
objWebbrowser.Navigate2 strPDF
Hier kommt nun das Schlüsselwort WithEvents für die Variable objWebBrowser zum Zuge: Dadurch können wir nämlich die Ereignisse dieses Steuerelements im aktuellen Klassenmodul implementieren. Dazu wählen wir im VBA-Editor im linken Kombinationsfeld den Eintrag objWebbrowser und im rechten Kombinationsfeld den Eintrag NavigateComplete2 aus. Der VBA-Editor legt dann automatisch eine Prozedur namens objWebbrowser_NavigateComplet2 an (siehe Bild 7).
Bild 7: Anlegen einer Ereignisprozedur für das WebBrowser-Steuerelement
In unserem Fall füllen wir die Ereignisprozedur mit den folgenden Anweisungen:
Private Sub objWebbrowser_NavigateComplete2(_ ByVal pDisp As Object, URL As Variant) On Error Resume Next Set objAcrobat = Me!ctlWebbrowser.Object.Document On Error GoTo 0 End Sub
Die einzige Anweisung, die etwas bewirkt, weist der Variablen objAcrobat das soeben geladene PDF-Dokument zu. Wozu aber benötigen wir die Deaktivierung der Fehlerbehandlung Das ist schnell erklärt: Bereits wenn wir das Formular öffnen, lädt das WebBrowser-Steuerelement eine Seite, in diesem Fall die Seite mit der Meldung, dass die Adresse ungültig ist.
Auch dieser Vorgang löst bereits das Ereignis NavigateComplete2 aus. Zu diesem Zeitpunkt sind wir allerdings noch weit davon entfernt, dass das WebBrowser-Steuerelement ein PDF-Dokument enthält. Folglich löst der Versuch, den Inhalt der Variablen des Typs AcroPDF zuzuweisen, einen Fehler aus – und den verhindern wir durch Deaktivierung der Fehlerbehandlung.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo