PDA

Vollständige Version anzeigen : Öffnen von PDF-Dokumenten


Michael3101
06.08.2001, 14:03
Ich möchte PDF-Dateien aus Access heraus per Schaltflächendruck anzeigen lassen. Ich habe schon versucht, den Acrobat-Reader mit bestimmten Befehelszeilenoptionen über Shell() auszurufen. Er wird dann zwar gestartet, meine Datei wird jedoch nicht angezeigt. Ich besitze Access97 und den Acrobat-Reader 4.0

Wer kann mir helfen?

Stefan Kulpa
06.08.2001, 18:07
<font face="Verdana" size="2">Hallo,

also eigentlich müsste das klappen, wie sieht denn die Befehlsfolge aus?
Um sicher zu gehen, hier eine etwas aufwendigere Lösung, die aber allgemeingültig ist:</font>

<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Option</FONT> <FONT COLOR=#000080>Explicit</FONT>

<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Declare</FONT> <FONT COLOR=#000080>Function</FONT> GetDesktopWindow <FONT COLOR=#000080>Lib</FONT> "user32" () <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Declare</FONT> <FONT COLOR=#000080>Function</FONT> GetShortPathName <FONT COLOR=#000080>Lib</FONT> "kernel32" <FONT COLOR=#000080>Alias</FONT> _
"GetShortPathNameA" _
(<FONT COLOR=#000080>ByVal</FONT> lpszLongPath <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpszShortPath <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> cchBuffer <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>) <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Declare</FONT> <FONT COLOR=#000080>Function</FONT> FindExecutable <FONT COLOR=#000080>Lib</FONT> "shell32.dll" <FONT COLOR=#000080>Alias</FONT> _
"FindExecutableA" _
(<FONT COLOR=#000080>ByVal</FONT> lpFile <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpDirectory <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpResult <FONT COLOR=#000080>As String</FONT>) <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Declare</FONT> <FONT COLOR=#000080>Function</FONT> ShellExecute <FONT COLOR=#000080>Lib</FONT> "shell32.dll" <FONT COLOR=#000080>Alias</FONT> _
"ShellExecuteA" _
(<FONT COLOR=#000080>ByVal</FONT> hwnd <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpOperation <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpFile <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpParameters <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> lpDirectory <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>ByVal</FONT> nShowCmd <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>) <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Sub</FONT> RunPDFFile(<FONT COLOR=#000080>ByVal</FONT> sPDFilepath <FONT COLOR=#000080>As String</FONT>)

<FONT COLOR=#000080>Dim</FONT> sReaderPath <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> lResult <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#008000>'** Zunächst herausfinden, ob und wenn wo der Reader installiert ist.</FONT>
sReaderPath = vbFindExecutable(sPDFilepath)
<FONT COLOR=#008000>'** Wurde ein Reader gefunden, die PDF-Datei anzeigen</FONT>
lResult = ShellExecute(GetDesktopWindow(), _
"Open", _
sReaderPath, _
sPDFilepath, _
0&, _
vbNormalFocus) <FONT COLOR=#008000>'vbNormalFocus = 1</FONT>

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Function</FONT> vbFindExecutable(<FONT COLOR=#000080>ByVal</FONT> sPath <FONT COLOR=#000080>As String</FONT>) <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Methode: | Ausführbares Programm für eine Datei ermitteln</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Parameter: | sPath - gültiger Dateipfad</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Rückgabe: | Pfad zum "zuständigen" Programm</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Beispiel: | MsgBox vbFindExecutable("C:\WINNT\SYSTEM.INI")</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#000080>Dim</FONT> sFile <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> sChar <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> sBuffer <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> sShortPath <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> sDirectory <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> sBugfixedPath <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> lResult <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Dim</FONT> lOffset <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#008000>'// ======================================================================</FONT>
<FONT COLOR=#008000>'// DOS-Pfad ermitteln</FONT>
<FONT COLOR=#008000>'// ======================================================================</FONT>
sShortPath = VBA.String(260, 0)
<FONT COLOR=#000080>If</FONT> GetShortPathName(sPath, sShortPath, Len(sShortPath)) <FONT COLOR=#000080>Then</FONT>
sPath = VBA.Left(sShortPath, VBA.InStr(sShortPath, vbNullChar) - 1)
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#008000>'// ======================================================================</FONT>
<FONT COLOR=#008000>'// Datei- und Ordner aus dem Gesamtpfad ermitteln (rudimentäre Methoden)</FONT>
<FONT COLOR=#008000>'// ======================================================================</FONT>
sFile = VBA.Mid$(sPath, VBA.InStrRev(sPath, "\") + 1)
sDirectory = VBA.Left$(sPath, Len(sPath) - Len(sFile))
<FONT COLOR=#008000>'// ======================================================================</FONT>
<FONT COLOR=#008000>'// Zuständige Applikation ermitteln</FONT>
<FONT COLOR=#008000>'// ======================================================================</FONT>
sBuffer = Space(260)
FindExecutable sFile, sDirectory, sBuffer
<FONT COLOR=#008000>'// ======================================================================</FONT>
<FONT COLOR=#008000>'// Bugfixing durchführen, da es u.U. fehlerhafte Registry-Einträge gibt</FONT>
<FONT COLOR=#008000>'// ======================================================================</FONT>
sBuffer = Trim$(sBuffer)
<FONT COLOR=#000080>If</FONT> Len(sBuffer) > 0 <FONT COLOR=#000080>Then</FONT>
<FONT COLOR=#000080>If</FONT> InStr(sBuffer, vbNullChar) > 0 <FONT COLOR=#000080>Then</FONT>
<FONT COLOR=#000080>For</FONT> lOffset = 1 <FONT COLOR=#000080>To</FONT> Len(sBuffer)
sChar = Mid(sBuffer, lOffset, 1)
<FONT COLOR=#000080>If</FONT> sChar <> vbNullChar <FONT COLOR=#000080>Then</FONT>
sBugfixedPath = sBugfixedPath + sChar
<FONT COLOR=#000080>Else</FONT>
sBugfixedPath = sBugfixedPath + " "
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>Next</FONT> lOffset
<FONT COLOR=#000080>Else</FONT>
sBugfixedPath = sBuffer
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>If</FONT> Len(sBugfixedPath) > 0 <FONT COLOR=#000080>Then</FONT>
lOffset = InStr(UCase(sBugfixedPath), UCase(sPath))
<FONT COLOR=#000080>If</FONT> lOffset > 1 <FONT COLOR=#000080>Then</FONT>
sBugfixedPath = Left(sBugfixedPath, lOffset - 1)
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>If</FONT> Asc(Right(sBugfixedPath, 1)) = 34 <FONT COLOR=#000080>Then</FONT> <FONT COLOR=#008000>'// Anführungszeichen</FONT>
sBugfixedPath = Left(sBugfixedPath, Len(sBugfixedPath) - 1)
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
vbFindExecutable = Trim$(sBugfixedPath)

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Function</FONT>
<FONT COLOR=#808080></FONT>

</FONT></PRE>

<font face="Verdana" size="2">Das Ganze kopierst du am besten in ein Modul und rufst dann die Methode RunPDFFile() mit Übergabe der anzuzeigenden PDF-Datei auf; Beispiel: <font color="#0000FF">Call RunPDFFile("C:\TEMP\TEST.PDF")</font>.

HTH

P.S.: Übrigens hat Du Dich im Forum "verirrt" - auch wenn es um VBA geht, sollten die Beiträge in den jeweiligen Programmforen (hier: Access) gestellt werden ... aber das ist ja erst Dein 2. Beitrag ;-)</font>

Michael3101
07.08.2001, 08:48
Danke für den Tipp, es hat funkioniert, ich musste nur InStrRev in InStr umändern, weil mein Access die Funktion nicht kannte. Ich habe da aber noch ein paar kleine Fragen:

1. Wie kann ich den Reader dazu bringen, dass er das PDF ausdruckt und sich dann wieder schliesst?

2. Wo finde ich eine Beschreibung zu ShellExecute() bzw. zu GetDesktopWindow(). Das scheinen ja recht nützliche Prozeduren zu sein, aber meine Online-Hilfe kennt sie nicht!

Stefan Kulpa
07.08.2001, 09:57
<font face="Verdana" size="2">
Hallo,

ob der Reader weitere Parameter unterstützt, weiss ich nicht. Gegebenfalls müsste man mal auf die Seite von Adobe gehen. Es gibt - glaube ich - allerding auch ein OCX-Control zur Steuerung von PDF-Dateien. Hierzu gibt's wohl auch ein SDK direkt bei Adobe.

ShellExecute() und GetDesktopWindow() sind API-Funktionen. Beschreibungen zu diesen und andere API-Funktionen findet man in der MSDN (entweder Online oder aber in der Hilfe, da die MSDN ab VB6 Pro. als Hilfe installiert wird).

Gruß</font>