Access und Adobe Reader 7

Access und Adobe Reader 7

Inhaltsübersicht:

  1. Einleitung
  2. Drucken mit ShellExecute
  3. Die Installation des OCX-Steuerelements
  4. Das OCX und der Adobe Reader
  1. Drucken aus dem OCX
  2. Das OCX und Hyperlinks
  3. Alternative OCX-Steuerelemente
  4. Anregungen und Ergänzungen

Einleitung

Ich habe mehrere Jahre mit dem Acrobat Reader 5 und auch mit dem OCX-Steuerelement zur Anzeige von PDF-Dokumenten gearbeitet. Dabei ist mit der Zeit einiges an Lösungen entstanden.

Im Rahmen einer neuen Plattform (Umstellung des Betriebssystems und aller Anwendungen auf den neusten Stand) im Jahr 2005 kam der Adobe Reader 7 und dessen OCX-Steuerelement zum Einsatz.

Welche Erfahrungen ich bei der Umstellung gemacht habe, welche Probleme es gibt und wie man diese lösen kann beschreibt dieser Artikel.

Zurück zur Übersicht

 

Drucken mit ShellExecute

Ausgangssituation mit Acrobat Reader 5:
Wenn man per VBA ein PDF-Dokument drucken möchte, verwendet man dazu die API-Funktion ShellExecute. Dabei wird ggfs. der Acrobat Reader 5 im Hintergrund geladen, und das gewünschte Dokument ausgedruckt. Der Acrobat Reader tritt dabei nicht sichtbar in Aktion.

Situation mit Adobe Reader 7:
Wenn man den selben Code mit dem Adobe Reader 7 ausführt, dann wird der Adobe Reader sichtbar in den Vordergrund geladen. Nach dem Ausdruck bleibt das Fenster im Vordergrund stehen und hat den Fokus.

Lösung:
Die Verwendung der Konstanten "SW_Hide" oder "SW_SHOWMINNOACTIVE" beim Aufruf von "ShellExecute" führen leider zu keiner Änderung.
Die einzige Lösung, die ich bisher erkenne, ist es, das Fenster des Adobe Readers nach dem Ausdruck per API zu minimieren und den Fokus wieder auf die Access-Anwendung zurück zu setzen.

Hierzu werden die API-Funktionen GetForegroundWindow, GetClassName, CloseWindow und SetForegroundWindow benötigt.

strDatei = "C:\Pfad\Datei.pdf"
ShellExecute Me.hWnd, "print", strDatei, vbNullString, "C:\", SW_SHOWNORMAL
If Right$(strDatei, 3) = "pdf" Then
  DoEvents
  strClassName = Space(256)
  Do
    hwnd = GetForegroundWindow
    GetClassName hwnd, strClassName, 256
    DoEvents
  Loop Until Trim$(strClassName) = "AdobeAcrobat"
  CloseWindow (hwnd)
  SetForegroundWindow (Application.hWndAccessApp)
End If

Ergänzung:
Mit einem Update auf die Version 7.0.5 oder höher ist dieses Problem beseitigt und der Adobe Reader verhält sich wieder wie gewohnt.

Zurück zur Übersicht

 

Die Installation des OCX-Steuerelements

Installation:
Wenn man den Adobe Reader installiert, wird das OCX-Steuerelement zur Anzeige von PDF's standardmäßig mit installiert. Die Option Webbrowser-Integration (Bearbeiten / Grundeinstellungen / Internet / "PDF im Browser anzeigen") ist standardmäßig aktiviert.

Wechselwirkungen:
Jetzt kommt der spannende Moment: Es gibt eine Wechselwirkung zwischen der Option "PDF im Browser anzeigen" und dem OCX.
Wenn man die Option entfernt, wird die Registrierung des OCX aufgehoben. Wenn man das OCX händisch mit regsvr32.exe registriert dann ist die Webbrowser-Integration wieder aktiv. Dies ist zwar in den Grundeinstellungen nicht sichtbar (das Häkchen bei "PDF im Browser anzeigen" ist nicht gesetzt), die PDF's werden aber im Browser angezeigt.

Problem:
Man kann mit dem Adobe Reader 7 nicht sicherstellen, dass das PDF-OCX auf einem System registriert ist. Selbst wenn man die Registrierung händisch vornimmt kann der User diese, unbeabsichtigt, durch das Ändern der Option "Webbrowser-Integration" wieder aufheben.

Lösung:
Es gibt einen RegKey mit dem man dem User das Ändern dieser Option verbieten kann. Die Option ist dann "ausgegraut" und kann nicht mehr verändert werden.

Der Pfad lautet: "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\7.0\FeatureLockdown". Dort wird ein Key mit dem Namen "bBrowserIntegration" vom Datentyp DWord und dem Wert 0 angelegt.

Um das Ändern dieser Option wieder zu erlauben reicht es nicht, den Wert von "0" auf "1" zu setzen. Statt dessen muss der Key gelöscht werden.

Zurück zur Übersicht

 

Das OCX und der Adobe Reader

Ausgangssituation (mit Acrobat Reader 5):
Über das OCX-Steuerelement kann ein gespeichertes PDF-Dokument angezeigt werden. Auch wenn die Datei gleichzeitig im Acrobat Reader 5 angezeigt wird kann die PDF-Datei in das OCX geladen werden.

Neue Situation (mit Adobe Reader 7):
Wenn eine PDF-Datei, die bereits im Adobe Reader angezeigt wird, im OCX angezeigt werden soll gibt es eine Fehlermeldung:
Laufzeitfehler '-2147467259 (80004005)'
Sie haben einen Ausdruck eingegeben, der eine unzulässigen Verweis auf die Eigenschaft | enthält.

Problem:
Dies liegt daran, dass der Adobe Reader 7 die Dateien bei der Anzeige locked. Damit kommt das OCX nicht klar.

Lösung:
Es gibt zwei Möglichkeiten zu Lösung dieses Problems:

  1. Vor der Anzeige im OCX werden die anzuzeigenden PDF-Dateien lokal kopiert. Die lokale Kopie wird im OCX angezeigt.
  2. Statt des OCX wird das Webbrowser-Steuerelement des IE zur Anzeige der Dokumente verwendet. Dieses legt scheinbar selber eine lokale Kopie im Browser-Cache ab. Dadurch wird das Problem umgangen. Der Ausdruck kann mit ShellExecute erfolgen.

Da es mit dem Ausdruck aus dem OCX ohnehin ein Problem gibt bevorzuge ich die zweite Variante. Hier muss ich mich nicht um das Erstellen einer lokalen Kopie kümmern.

Zurück zur Übersicht

 

Drucken aus dem OCX

Ausgangssituation (mit Acrobat Reader 5):
Wenn ein PDF-Dokument im OCX-Steuerelement angezeigt wird, kann es ausgedruckt werden. Dazu wird die Methode "PrintAll" des OCX verwendet. Der Ausdruck erfolgt ohne weitere Interaktion mit dem User.

Neue Situation (mit Adobe Reader 7):
Wenn der Ausdruck mit der PrintAll-Methode über das 7-OCX angefordert wird, erscheint eine Sicherheitsabfrage:
"WARNUNG! Ein Skript hat die Druckausgabe einer Acrobat-Datei angefordert. Möglichweise wird das gesamte Dokument gedruckt. Möch".
Der Text der Messagebox hört mitten im Wort auf. Zusätzlich ist eine Checkbox mit dem Text "Diese Meldung nicht mehr anzeigen" vorhanden.
Ich habe bisher keine Möglichkeit gefunden, diesen Dialog zu unterdrücken.

Problem:
Wenn das Häkchen bei "Diese Meldung..." gesetzt wird und das Formular mit "Ja" verlassen wird, wird das angeforderte Dokument gedruckt. Weitere Dokumente werden jedoch nicht mehr gedruckt.

Lösung:
Die PrintAll-Methode des OCX ist auf Grund des Dialogfeldes und des Abbruchs der folgenden Druckaufträge für den Einsatz mit Access nicht geeignet. Statt dessen können die Dokumente mit der API-Funktion ShellExecute gedruckt werden.

Ergänzung:
Mit einem Update auf die Version 7.0.5 oder höher ist dieses Problem beseitigt. Es erscheint zwar einmalig die Sicherheitsabfrage. Wenn man diese bestätigt, verhält sich der Adobe Reader aber wieder wie gewohnt. 

Zurück zur Übersicht

 

Das OCX und Hyperlinks

Ausgangssituation (mit Acrobat Reader 5):
Ein PDF-Dokument, welches Hyperlinks enthält, wird im OCX angezeigt. Wenn man auf die Hyperlinks klickt, öffnet sich der Standardbrowser mit der entsprechenden Seite.

Neue Situation (mit Adobe Reader 7):
Das selbe PDF-Dokument wird im 7-OCX angezeigt. Wenn man jetzt den Cursor auf die Hyperlinks setzt, werden diese erkannt (der Cursor wird zur Hand).

Problem:
Es passiert nichts, wenn man im 7-OCX auf die Hyperlinks klickt. Das Browser-Fenster öffnet sich nicht. Die angeforderten Seiten werden nicht angezeigt.

Lösung:
Eine Lösung ist bisher nicht in Sicht. Es bleibt zu hoffen, dass Adobe diesen Bug in einer folgenden Version beseitigt.

Ergänzung:
Mit einem Update auf die Version 7.0.5 oder höher ist dieses Problem beseitigt und der Adobe Reader verhält sich wieder wie gewohnt.

Zurück zur Übersicht

 

Alternative OCX-Steuerelemente

Nachteile des OCX:

Meine Bewertung:
Die Nachteile des OCX-Steuerelements können zum großen Teil umgangen werden. Dafür müssen jedoch zusätzlicher Aufwand und anderweitige Einschränkungen in Kauf genommen werden.
Aus diesem Grund habe ich mich entschlossen, ein alternatives OCX-Steuerelement für die Anzeige von PDF's zu suchen.

Links:
Ich habe bisher folgende Links zu alternativen OCX-Steuerelementen ergoogelt:

Diese Liste ist rein subjektiv und stellt keine Bewertung dar. Die Reihenfolge ist rein zufällig.

Shareware- oder Freeware-OCX gesucht:
Alle bisher gefundenen alternativen OCX-Steuerelemente sind kommerzielle Produkte. Ich habe noch kein OCX-Steuerelement als Shareware oder gar als Freeware gefunden.
Meine Bitte: Wenn Sie ein solches OCX-Steuerelement finden, senden Sie mir bitte ein E-Mail.

Zurück zur Übersicht

 

Anregungen und Ergänzungen

Dieses Dokument lebt. Es ist Stück für Stück entstanden - und es ist sicher noch nicht vollständig.

Anregungen und Ergänzungen zu diesem Dokument sind immer willkommen. Am besten senden Sie mir ein E-Mail.

Auf diesem Weg kann das Wissen um das Zusammenspiel von Adobe Reader 7 und Access nach und nach ergänzt und vervollständigt werden.

Zurück zur Übersicht