Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PDF Dateien in Access anzeigen bzw. aufrufen?

4,307 views
Skip to first unread message

Markus Misiak

unread,
Dec 9, 2005, 3:53:39 AM12/9/05
to
Hallo zusammen,

ich möchte gerne PDF-Dateien, welche in einem festgelegten Verzeichnis
gespeichert sind, über ein Access-Formular anzeigen lassen. Hat hier jemand
Erfahrungen mit dieser Thematik? Es ist mir im Prinzip egal, ob die
PDF-Anzeige im Formular "eingebettet" ist (wäre mir zwar am liebsten), oder
ob ich die Dateien nur anklicken brauche und sie werden dann im Acrobat
Reader als eigenes Fenster angezeigt.

Würde mich über Ratschläge freuen!

Viele Grüße

Markus


Joerg Ackermann

unread,
Dec 9, 2005, 4:01:13 AM12/9/05
to
Hi,

Markus Misiak wrote:

> ich möchte gerne PDF-Dateien, welche in einem festgelegten Verzeichnis
> gespeichert sind, über ein Access-Formular anzeigen lassen. Hat hier
> jemand Erfahrungen mit dieser Thematik? Es ist mir im Prinzip egal,
> ob die PDF-Anzeige im Formular "eingebettet" ist (wäre mir zwar am
> liebsten), oder ob ich die Dateien nur anklicken brauche und sie
> werden dann im Acrobat Reader als eigenes Fenster angezeigt.

Application.FollowHyperlink PfadUndNameDerPdfDatei

Gruß

Karl Donaubauer

unread,
Dec 9, 2005, 4:40:49 AM12/9/05
to

Und falls dich die dann in Access und z.T. auch im PDF-Reader
auftauchenden Web-Symbolleisten stören, verwende ShellExecute:
http://www.mvps.org/access/api/api0018.htm

--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Datenbank-Profis: http://www.dbdev.org

Markus Misiak

unread,
Dec 9, 2005, 11:38:59 AM12/9/05
to
Ok, vielen Dank schon mal für die Hinweise, im eigenen Fenster funktioniert
das schon mal.

Schöner wäre es für mich, wenn das pdf-Dokument im Formular "eingebettet"
wäre. Ich habe hierfür mal ein Adobe Acrobat Control for ActiveX Object
eingefügt, aber irgendwie komme ich damit nicht klar. Soweit ich
herausbekommen habe, kann man diesem Objekt mit der .scr Eigenschaft die
Datei angeben. Irgendwie funktioniert das aber nicht. :-(

Hat jemand Erfahrungen mit diesem Weg und kann mir mal den Code hier
einstellen?

Viele Grüße

Markus

"Karl Donaubauer" <NoS...@donkarl.com> schrieb im Newsbeitrag
news:3vt1p6F...@individual.net...

Jörg Ostendorp

unread,
Dec 9, 2005, 12:09:03 PM12/9/05
to
Hallo Markus,

> Schöner wäre es für mich, wenn das pdf-Dokument im Formular "eingebettet"
> wäre. Ich habe hierfür mal ein Adobe Acrobat Control for ActiveX Object
> eingefügt, aber irgendwie komme ich damit nicht klar. Soweit ich
> herausbekommen habe, kann man diesem Objekt mit der .scr Eigenschaft die
> Datei angeben. Irgendwie funktioniert das aber nicht. :-(

Nee, das geht eigentlich einfach per DeinObject.Loadfile "DeineDatei".

Wenn ich mich richtig entsinne, gab es hier aber vor ein paar Monaten
allerdings einen Thread, in dem es um die Schwierigkeiten mit der neuesten
Acrobat-Version ging, die auch das OCX btrifft. Kriege den Zusammenhang
nicht mehr ganz auf die Reihe, entweder fehlte das Ding oder die Datei
wurde nicht geladen. Bei Adobe gabs dazu, glaube ich, auch eine Anmerkung.
Hab den Thread jetzt so spontan leider nicht mehr gefunden. Vielleicht
entsinnt sich ja noch jemand besser daran.

Viele Grüße
Jörg Ostendorp

Thomas Möller

unread,
Dec 9, 2005, 4:17:57 PM12/9/05
to
Hallo Jörg,

Jörg Ostendorp <Vorname...@gmx.de> schrieb:

ich glaube, da kann ich helfen....

Schau mal auf meiner HP unter Access / Tipps und Tricks. Dort findet sich
ein Artikel mit dem Namen "Access und Adobe Reader 7".

Der genannte Thread findet sich hier:
http://groups.google.de/group/microsoft.public.de.access/browse_thread/thread/5f127e664cc78aa4/0633e72e067cd4cc?lnk=st&q=Access+adobe+group%3Amicrosoft.public.de.access+author%3AThomas+author%3AM%C3%B6ller&rnum=3&hl=de#0633e72e067cd4cc

HTH
--
Thomas

Homepage: www.Team-Moeller.de

TM-DateiFunktionen: Update auf Version 1.2 (seit 08.11.05)
Funktion "GetSpecialFolder" hinzugefügt.

Jörg Ostendorp

unread,
Dec 10, 2005, 11:55:58 AM12/10/05
to
Hallo Thomas,

>>> Schöner wäre es für mich, wenn das pdf-Dokument im Formular
>>> "eingebettet" wäre. Ich habe hierfür mal ein Adobe Acrobat Control
>>> for ActiveX Object eingefügt, aber irgendwie komme ich damit nicht
>>> klar. Soweit ich herausbekommen habe, kann man diesem Objekt mit der
>>> .scr Eigenschaft die Datei angeben. Irgendwie funktioniert das aber
>>> nicht. :-(

>> Nee, das geht eigentlich einfach per DeinObject.Loadfile "DeineDatei".
>>
>> Wenn ich mich richtig entsinne, gab es hier aber vor ein paar Monaten
>> allerdings einen Thread, in dem es um die Schwierigkeiten mit der
>> neuesten Acrobat-Version ging, die auch das OCX btrifft. Kriege den
>> Zusammenhang nicht mehr ganz auf die Reihe, entweder fehlte das Ding
>> oder die Datei wurde nicht geladen. Bei Adobe gabs dazu, glaube ich,
>> auch eine Anmerkung. Hab den Thread jetzt so spontan leider nicht
>> mehr gefunden. Vielleicht entsinnt sich ja noch jemand besser daran.

> ich glaube, da kann ich helfen....
>
> Schau mal auf meiner HP unter Access / Tipps und Tricks. Dort findet sich
> ein Artikel mit dem Namen "Access und Adobe Reader 7".

habe gerade Deinen Artikel gelesen und mal ein klein wenig rumprobiert.
Evtl. könnte man als Alternative zum OCX auch einfach das Adobe
Applikationsfenster per SetParent in ein Formular einfügen. Scheint bei mir
problemlos zu funktionieren. Noch ein wenig am Style rumbasteln und das
ganze sieht auch optisch ganz ok aus.

Ja, genau den meinte ich, hatte nur in den Artikeln der letzten sechs
Monate gesucht. Hach, wie die Zeit vergeht.. ;-)

Viele Grüße
Jörg Ostendorp

Thomas Möller

unread,
Dec 11, 2005, 5:24:29 AM12/11/05
to
Hallo Jörg,

Jörg Ostendorp <Vorname...@gmx.de> schrieb:
>> [Probleme mit Adobe OCX]


> habe gerade Deinen Artikel gelesen und mal ein klein wenig
> rumprobiert. Evtl. könnte man als Alternative zum OCX auch einfach
> das Adobe Applikationsfenster per SetParent in ein Formular einfügen.
> Scheint bei mir problemlos zu funktionieren. Noch ein wenig am Style
> rumbasteln und das ganze sieht auch optisch ganz ok aus.

das klingt interessant. Allein ich verstehe noch nicht ganz genau, wie Du
das realisierst. Kannst Du das bitte noch etwas ausführlicher beschreiben -
oder hast Du gar ein Beispiel?

TIA

Jörg Ostendorp

unread,
Dec 11, 2005, 7:59:04 AM12/11/05
to
Hallo Thomas,

>>> [Probleme mit Adobe OCX]
>> habe gerade Deinen Artikel gelesen und mal ein klein wenig
>> rumprobiert. Evtl. könnte man als Alternative zum OCX auch einfach
>> das Adobe Applikationsfenster per SetParent in ein Formular einfügen.
>> Scheint bei mir problemlos zu funktionieren. Noch ein wenig am Style
>> rumbasteln und das ganze sieht auch optisch ganz ok aus.
>
> das klingt interessant. Allein ich verstehe noch nicht ganz genau, wie Du
> das realisierst. Kannst Du das bitte noch etwas ausführlicher beschreiben -
> oder hast Du gar ein Beispiel?

hier mal ein kleines Beispiel, wie ich mir das ungefähr dachte.
Problematisch ist bei mir, daß extern geöffnete pdfs nun im Formular
angezeigt werden, dh. man müßte noch entweder für mehrere Adobe-Instanzen
sorgen oder das Fenster rechtzeitig wieder freigeben. Am Style kann man
natürlich auch noch ein wenig rumspielen z.B. mit einem Access-Rahmen statt
des WS-DLGFRAMEs. (Und wenn mans ordentlich machen will, gehört das Fenster
natürlich in den Detailbereich, nicht direkt aufs Formular..)

Aber wie gesagt, ist ja nur ein erster Test.

Viele Grüße
Jörg Ostendorp

'--------------------------------------------------------------------------
'Code ins Formular

Option Compare Database
Option Explicit

Private Declare Function FindWindow _
Lib "user32.dll" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long

Private Declare Function FindWindowEx _
Lib "user32.dll" _
Alias "FindWindowExA" ( _
ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String _
) As Long

Private Declare Function GetClassName _
Lib "user32.dll" _
Alias "GetClassNameA" ( _
ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long _
) As Long

Private Declare Function GetWindow _
Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByVal wCmd As Long _
) As Long

Private Declare Function SendMessage _
Lib "user32.dll" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any _
) As Long

Private Declare Function SetParent _
Lib "user32.dll" ( _
ByVal hWndChild As Long, _
ByVal hWndNewParent As Long _
) As Long

Private Declare Function SetWindowLong _
Lib "user32.dll" _
Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) As Long

Private Declare Function SetWindowPos _
Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) As Long

Private Declare Function ShellExecute _
Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long _
) As Long

Private Declare Function ShowWindow _
Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByVal nCmdShow As Long _
) As Long

Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Const GWL_STYLE As Long = -16
Private Const SW_MAXIMIZE As Long = 3
Private Const SWP_SHOWWINDOW As Long = &H40
Private Const WM_CLOSE As Long = &H10
Private Const WS_CHILD As Long = &H40000000
Private Const WS_CLIPSIBLINGS As Long = &H4000000
Private Const WS_DLGFRAME As Long = &H400000
Private Const WS_OVERLAPPED As Long = &H0&
Private Const WS_VISIBLE As Long = &H10000000

Dim hApp As Long 'Applikationsfenster
Dim hMDI As Long ' mdi-fenster
Dim hW As Long ' Datei-Fenster


'Aufruf per Button
Private Sub Command0_Click()
ShowPDF "MeinPfad mit abschließendem \", "Meine Datei"
End Sub


Private Sub ShowPDF(strPath As String, strFile As String)
Dim strCaption As String
Dim i As Long
ShellExecute Me.hwnd, "open", strPath & strFile, _
vbNullString, vbNullString, 0

'Warten bis handle erstellt ist, hier mal provisorisch per
'doevents
For i = 1 To 2000
DoEvents
Next i

hApp = FindWindow(vbNullString, "Acrobat Reader")
strCaption = strFile

'Nix gefunden weil Dateifenster maximiert ist (=andere Caption)
If hApp = 0 Then
strCaption = "Acrobat Reader - [" & strFile & "]"
hApp = FindWindow(vbNullString, strCaption)
End If

If hApp <> 0 Then
'Das Dateifenster soll maximiert angezeigt werden, daher
'muß erstmal dessen Handle ermittelt werden
'Handle MDI-Fenster
hMDI = GetMDI(hApp)
'Handle Dateifenster
hW = FindWindowEx(hMDI, ByVal 0&, vbNullString, strFile)
'Applikationsfenster einfangen
SetParent hApp, Me.hwnd
'Style verändern
SetWindowLong hApp, GWL_STYLE, WS_VISIBLE Or _
WS_CHILD Or _
WS_CLIPSIBLINGS Or _
WS_OVERLAPPED Or _
WS_DLGFRAME
'Positionieren/Style aktivieren
SetWindowPos hApp, 0, 100, 50, 500, 400, SWP_SHOWWINDOW
'Dateifenster maximieren
ShowWindow hW, SW_MAXIMIZE

'Das automatische Neuzeichnen der Toolbars klappt nicht so
'recht, daher hier mal ohne weiteren Aufstand:
Application.Echo False
DoCmd.Minimize
DoCmd.Restore
Application.Echo True
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
'Acrobat wieder freigeben
SetParent hApp, 0
'und Fenster schließen
SendMessage hApp, WM_CLOSE, 0, 0
End Sub

Private Function GetMDI(hwnd As Long) As Long
Dim chwnd As Long
chwnd = GetWindow(hwnd, GW_CHILD)
Do
If fGetClassName(chwnd) = "MDIClient" Then
GetMDI = chwnd
Exit Function
End If
chwnd = GetWindow(chwnd, GW_HWNDNEXT)
Loop While chwnd <> 0
GetMDI = 0

End Function

Private Function fGetClassName(hwnd As Long)
Dim strBuffer As String
Dim lngLen As Long
Const MAX_LEN = 255
strBuffer = Space$(MAX_LEN)
lngLen = GetClassName(hwnd, strBuffer, MAX_LEN)
If lngLen > 0 Then fGetClassName = Left$(strBuffer, lngLen)
End Function

Thomas Möller

unread,
Dec 11, 2005, 12:18:53 PM12/11/05
to
Hallo Jörg,

Jörg Ostendorp <Vorname...@gmx.de> schrieb:


>>>> [Probleme mit Adobe OCX]
>>> habe gerade Deinen Artikel gelesen und mal ein klein wenig
>>> rumprobiert. Evtl. könnte man als Alternative zum OCX auch einfach
>>> das Adobe Applikationsfenster per SetParent in ein Formular
>>> einfügen. Scheint bei mir problemlos zu funktionieren. Noch ein
>>> wenig am Style rumbasteln und das ganze sieht auch optisch ganz ok
>>> aus.
>>
>> das klingt interessant. Allein ich verstehe noch nicht ganz genau,
>> wie Du das realisierst. Kannst Du das bitte noch etwas ausführlicher
>> beschreiben - oder hast Du gar ein Beispiel?
>
> hier mal ein kleines Beispiel, wie ich mir das ungefähr dachte.
> Problematisch ist bei mir, daß extern geöffnete pdfs nun im Formular
> angezeigt werden, dh. man müßte noch entweder für mehrere
> Adobe-Instanzen sorgen oder das Fenster rechtzeitig wieder freigeben.
> Am Style kann man natürlich auch noch ein wenig rumspielen z.B. mit
> einem Access-Rahmen statt des WS-DLGFRAMEs. (Und wenn mans ordentlich
> machen will, gehört das Fenster natürlich in den Detailbereich, nicht
> direkt aufs Formular..)

vielen, vielen Dank für dieses Beispiel.

Ich habe mir den Code gesichert. Wenn ich das Projekt wieder in den Fingern
habe werde ich mir die Sache genauer anschauen.

THX

Markus Misiak

unread,
Dec 12, 2005, 5:27:14 AM12/12/05
to
Hallo Jörg,

vielen Dank für Deine Hilfe.


">
> Nee, das geht eigentlich einfach per DeinObject.Loadfile "DeineDatei".

Ich glaube ich stelle mich einfach zu dumm an. Ich habe den Arcrobat Reader
7.05 installiert und habe in einem Formular das ActiveX-Steuerelement "Adobe
Acrobat 7.0 Browser Document" eingebunden. Irgendwie krieg ich den VBA-Code
nicht hin um per Button ein bestehendes PDF-File anzeigen zu lassen. Könnte
mir hier jemand unter die Arme greifen bzw. gibt es eigentlich eine
"aussagekräftige" Beschreibung für die PDFLib?

Viele Grüße

Markus


Jörg Ostendorp

unread,
Dec 12, 2005, 6:05:42 AM12/12/05
to
Hallo Markus,

>> Nee, das geht eigentlich einfach per DeinObject.Loadfile "DeineDatei".
>
> Ich glaube ich stelle mich einfach zu dumm an. Ich habe den Arcrobat Reader
> 7.05 installiert und habe in einem Formular das ActiveX-Steuerelement "Adobe
> Acrobat 7.0 Browser Document" eingebunden. Irgendwie krieg ich den VBA-Code
> nicht hin um per Button ein bestehendes PDF-File anzeigen zu lassen. Könnte
> mir hier jemand unter die Arme greifen bzw. gibt es eigentlich eine
> "aussagekräftige" Beschreibung für die PDFLib?

Private Withevents objPDF as AcroPDF

Private Sub DeinButton_Click()
Set objPDF = Me!DeinPDFControl.Object 'bzw. im Form_Load
objPDF.LoadFile "DeineDatei.pdf"
End Sub

Hinsichtlich der Beschreibung für die PDFLib ist mir nichts bekannt, würde
mir einfach mal die Metoden im Objektexplorer anschauen, die meisten sind
ja recht aussagekräftig benamst. Ansonsten schau mal direkt auf der
Adobe-Seite, denke schon, daß es da irgendetwas gibt.

Du solltest Dir aber auch unbedingt den Artikel von Thomas durchlesen!

Viele Grüße
Jörg Ostendorp

Jörg Ostendorp

unread,
Dec 12, 2005, 6:30:31 AM12/12/05
to
Hallo Thomas,

kleine Ergänzung. Habe mir gerade die neueste Version draufgespielt und da
scheint einiges etwas anders zu funktionieren:
- weiß nicht genau, ob es an der Version liegt oder an der Sprache (habe
jetzt englisch vorher deutsch), jedenfalls heißt es das Ding bei mir nicht
mehr Acrobat Reader sondern Adobe Reader, was man wegen des Handles
natürlich berücksichtigen müßte.
- Bei mir gibts jetzt Fehlermeldungen beim Schließen, wenn man den Style
nicht zurück. Also sollte man noch ergänzen:
...
Private Declare Function GetWindowLong _
Lib "user32.dll" _
Alias "GetWindowLongA" ( _

ByVal hwnd As Long, _
ByVal nIndex As Long _
) As Long
...
Dim lStyle as long

Private Sub ShowPDF(strPath As String, strFile As String)

...
If hApp <> 0 Then
lStyle = GetWindowLong(hApp, GWL_STYLE)
....
end sub

Private Sub Form_Unload(Cancel As Integer)

SetParent hApp, 0
'Style zurücksetzen
SetWindowLong hApp, GWL_STYLE, lStyle


SendMessage hApp, WM_CLOSE, 0, 0
End Sub

(Ist sowieso besser, falls die Sendmessage fehlschlägt. Dann kann der
Nutzer das zumindest noch von Hand schließen).

Viele Grüße
Jörg Ostendorp

Christian Kaltenbrunner

unread,
Dec 12, 2005, 9:51:49 AM12/12/05
to
Hallo Markus,

"Markus Misiak" <markus...@mpf-ag.de> schrieb im Newsbeitrag
news:dnjj9q$6uf$1...@online.de...

ich habe es so gelöst:

stAppName = LesePfad & " " & VarLese & Me!DateiName
'Anmerkung "C:\Programme\Adobe\Acrobat 7.0\Reader\AcroRd32.exe"
"C:\PDFDatei\Sicherung\novell.pdf"

Call Shell(stAppName, 3)

mit dem Parameter /t wird der ausdruck sofort gestartet.

Gruß
Christian

0 new messages