Vanuit ACCESS pdf openen op een specifieke pagina

Status
Niet open voor verdere reacties.

AnnePsdB

Nieuwe gebruiker
Lid geworden
11 jan 2016
Berichten
4
In een database wordt per record verwezen naar een bepaalde pagina in een Pdf. Het veld [bestandsnaam] bevat de naam van het Pdf. Het veld [PAGE] het bladzijdenummer in het Pdf. Dankzij dit forum lukt het mij nu om via een knop het juiste Pdf te openen met onderstaande code. Hoe kan ik in onderstaande code ervoor zorgen dat na opening van het pdf de juiste pagina wordt geopend genoemd in het veld [PAGE]?

Code:
Dim DocPath As String
    DocPath = GetDocPath & Me.bestandsnaam
    Dim stDocName As String
    Dim stLinkCriteria As String
    If Len([bestandsnaam]) > 0 And Len(Dir(DocPath)) > 0 Then
        CreateObject("Shell.Application").ShellExecute DocPath
    Else
        MsgBox "Er is geen pdf aanwezig behorende bij dit record", , "GEEN Pdf aanwezig!"
    End If
End Sub
Public Function GetDocPath() As String
    GetDocPath = GetDBPath & "Pdf\"
End Function
 
Bijzonder ingewikkelde code die je door één regel kan vervangen (je hebt de code dus niet van mij ;)). Maar dat maakt voor je vraag niet uit. Ik weet niet of er met VBA een oplossing is, omdat je een actie wilt uitvoeren in een programma dat niet met VBA werkt (Adobe Reader vermoed ik).
Je moet denk ik met een scripting taal gaan werken die de handelingen uitvoert. Zelf zou ik daar geen enkele energie in steken, omdat je op een bloedsimpele manier in je reader een specifieke pagina kan opzoeken. Binnen een seconde. Dus waarom je dat zou automatiseren ontgaat mij een beetje.
 
Beste Octafish. Ik was er al bang voor dat dit niet kon vanuit ACCESS. Op de bewuste pagina's staan foto's van het product. Sommige pdf's zijn 400 bladzijden lang. Zou dan mooi zijn om met 1 klik de foto te zien in plaats van na openen Ctr-F en handmatig de pagina in te vullen. Bij oudere records is geen pdf voorhanden vandaar de controle in de code.
Ik ben (ter lering en vermaak) wel benieuwd naar je 1 regel code.
 
Code:
If Me.Bestandsnaam & “” <>”” Then FollowHyperlink CurrentProject.Path & “\PDF\” & Me.Bestandsnaam
Lijkt mij voldoende :).
 
Het kan ook met een lichtgewicht pdf-reader zoals SumatraPDF. Deze kun je zelfs in portable-versie naast zwaargewicht Adobe gebruiken zodat je niets hoeft te installeren.
Kijk voor de navigatieopties op https://www.sumatrapdfreader.org/docs/Command-line-arguments.html om met -page <pageNo> naar de betreffende pagina te springen.
Ik gebruik dit al jaren naar volle tevredenheid en het is freeware.
 
Vanuit ACCESS pdf in Adobe openen op een specifieke pagina ongeacht pad Adobe

Mede dank zij jullie tips en met hulp van een macro expert is het uiteindelijk gelukt om vanuit ACCESS een pdf te openen op een specifieke pagina. Het veld PAGE gaf problemen en heb ik veranderd in Blz. In onderstaande code wordt nu Adobe opgestart. Daar zit gelijk mijn laatste probleem. Als de database nu op een andere pc wordt gebruikt en Adobe daar een ander pad heeft moet de code daar weer op aangepast worden. Hoe kan ik ongeacht het pad Adobe opstarten?
Code:
Private Sub Knop102_Click()

    Dim stDocName As String
    Dim stLinkCriteria As String
   
    If Me.bestandsnaam & "" <> "" Then
    Open_PDF_At_Page
    Else
    MsgBox "Er is geen pdf aanwezig behorende bij dit record", , "GEEN pdf aanwezig!"
    End If
End Sub


Private Sub Open_PDF_At_Page()
Dim cAdobeReaderExe As String
cAdobeReaderExe = "C:\Program Files\Adobe\Reader\AcroRd32.exe"
Dim PDFfile As String
Dim AdobeCommand As String
   
    PDFfile = CurrentProject.Path & "\Pdf\" & Me.bestandsnaam
    blzincommand = "page=" & Me.Blz & "=Open Actions"
    AdobeCommand = " /a ""page=" & Me.Blz & "=Open Actions"" "
   
    Shell cAdobeReaderExe & AdobeCommand & Chr(34) & PDFfile & Chr(34), vbNormal

End Sub
 
... en dat probleem had ik dus ook :(
Dus kom ik terug op mijn oplossing die ik bedacht had. Met een portable PDF-reader die je bv in een submap zet bij de backend kun je vanuit elke frontend de PDF's benaderen zoals je het wilt, al naar gelang de parameters die je gebruikt.
Zie hieronder de code die ik gebruik, waarbij de benodigde parameters uit een tabel geplukt en gebruikt worden, om een of meer afdrukken op de achtergrond te maken en een voorbeeldweergave te openen. Misschien kun je er wat mee.

Code:
Private Sub B_Afdrukken_Click()
Dim Afdruk, varPrinter, varAantal, varPad, varAfdrukParam
    varPrinter = DLookup("P_Waarde", "Q_PDFPrinter", "P_Veldinfo=" & "'PDFPrinter'")
    varPad = Me.Pa_Pad
    varAantal = Forms!F_PDF!Aantal & "x"
    varAfdrukParam = varPrinter & " " & varPad & " -print-settings " & Chr(34) & varAantal & " ,duplex" & Chr(34)
    If Dir(Me.Pa_Pad) <> "" Then
        Afdruk = Shell("N:\MapWaarPortablePDFviewerStaat\SumatraPDF.exe -print-to " & varAfdrukParam)
    Else
        MsgBox "Het PDF-bestand bestaat niet of is verplaatst.", vbCritical, "Melding"
    End If
End Sub

Private Sub B_Voorbeeld_Click()
    Dim Voorbeeld
    Voorbeeld = Shell("N:\MapWaarPortablePDFviewerStaat\SumatraPDF.exe" & " " & Me.Pa_Pad)
End Sub
 
Je moet het pad dan ook niet vastleggen, maar opvragen. Met deze aanpassing zou het moeten werken:
Code:
Sub Open_PDF_At_Page()
Dim cAdobeReaderExe As String
Dim PDFfile As String
Dim AdobeCommand As String
   
    cAdobeReaderExe = FindAcrobat
    If cAdobeReaderExe = "Niet gevonden " Then
        MsgBox "Zorg dat Acrobat is geïnstalleerd op de computer", vbCritical
        Exit Sub
    End If
    
    PDFfile = CurrentProject.Path & "\Pdf\" & Me.bestandsnaam
    blzincommand = "page=" & Me.Blz & "=Open Actions"
    AdobeCommand = " /a ""page=" & Me.Blz & "=Open Actions"" "

    Shell cAdobeReaderExe & AdobeCommand & Chr(34) & PDFfile & Chr(34), vbNormal

End Sub

Code:
Function FindAcrobat() As String
Dim sh As Variant, ExePath As String, ExeName As String, tmp As Variant
    Set sh = CreateObject("WScript.Shell")
    On Error GoTo Hell
    ExePath = sh.RegRead("HKCR\Software\Adobe\Acrobat\Exe\")
    If Dir(Mid(ExePath, 2, Len(ExePath) - 2)) <> "" Then
        FindAcrobat = Mid(ExePath, 2, Len(ExePath) - 2)
    End If
    Exit Function

Hell:
    If Err.Number <> 0 Or ExeName = "" Then FindAcrobat = "Niet gevonden"
End Function
 
Kan zelfs nog iets korter:
Code:
Function FindAcrobat() As String
    On Error GoTo Hell
    FindAcrobat = Replace(CreateObject("WScript.Shell").RegRead("HKCR\Software\Adobe\Acrobat\Exe\"), """", "")
    If Dir(FindAcrobat) = "" Then FindAcrobat = "Niet gevonden"
    Exit Function

Hell:
    If Err.Number <> 0 Then FindAcrobat = "Niet gevonden"
End Function

"HKCR" is hetzelfde als "HKEY_CLASSES_ROOT", dus je mag beide varianten gebruiken.
 
Bedankt voor alle hulp en de verschillende oplossingen. Met de laatste twee oplossingen het werkende gekregen.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan