在VBA中打开特定页码的PDF

时间:2011-06-15 17:24:34

标签: ms-access vba

我正在尝试在我的访问表单上创建一个按钮,允许用户查看与表单中的数据一致的相应页面(在这种情况下,表单上显示了部件号,我想要按钮打开零件标准文件以显示所述零件的蓝图/图表

我尝试在文件路径末尾使用Adobe的页面参数#page = pagenum,但这样做不起作用。

这是我的代码(基本,我知道),但我想弄清楚去哪里。我简单地压缩了我的文件路径,原因显而易见 - 注意:它不是URL,而是文件路径,如果这很重要。

Private Sub Command80_Click()

    Dim loc As String 'location of file

    'loc = Me.FileLoc
    loc = "G:\*\FileName.pdf#page=1"

    Debug.Print loc
    'Debug.Print Me.FileLoc
    'Debug.Print Me.FileName

    Application.FollowHyperlink loc

End Sub

这可以这样做吗?我将继续阅读其他用户的帖子,希望找到一个解决方案,如果我找到了解决方案,我会在这里注意。

谢谢!

更新

我找到了一种方法来做到这一点,现在我只有一个小的并发症。我的数据库将被许多用户访问,可能使用不同版本的Acrobat或不同的位置。这是我的工作代码:

Private Sub Command2_Click()

pat1 = """C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"""

pat2 = "/A ""page=20"""

pat3 = """G:\*\FileName.pdf"""

Shell pat1 & " " & pat2 & " " & pat3, vbNormalFocus

End Sub

现在,这是我的担忧。此代码从特定文件路径打开AcroRd32.exe,如果我的用户将其存储在其他地方或具有不同的版本,则无法使用。有没有人建议如何解决这个问题?

再次感谢! :)

5 个答案:

答案 0 :(得分:3)

正确的方法可能是在系统注册表中查找acrobat reader可执行文件的位置。我发现这通常比它的价值更麻烦,特别是如果我可以控制我的程序安装的所有地方(例如在一个内部网中)。通常我最终会使用我写的这个函数:

'---------------------------------------------------------------------------------------
' Procedure : FirstValidPath
' Author    : Mike
' Date      : 5/23/2008
' Purpose   : Returns the first valid path found in a list of potential paths.
' Usage     : Useful for locating files or folders that may be in different locations
'               on different users' computers.
' Notes     - Directories must be passed with a trailing "\" otherwise the function
'               will assume it is looking for a file with no extension.
'           - Returns Null if no valid path is found.
' 5/6/11    : Accept Null parameters.  If all parameters are Null, Null is returned.
'---------------------------------------------------------------------------------------
'
Function FirstValidPath(ParamArray Paths() As Variant) As Variant
Dim i As Integer

    FirstValidPath = Null
    If UBound(Paths) - LBound(Paths) >= 0 Then
        For i = LBound(Paths) To UBound(Paths)
            If Not IsNull(Paths(i)) Then
                If Len(Dir(Paths(i))) > 0 Then
                    FirstValidPath = Paths(i)
                    Exit For
                End If
            End If
        Next i
    End If

End Function

该函数采用参数数组,因此您可以根据需要传递多个或几个路径:

PathToUse = FirstValidPath("C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe", _
                           "C:\Program Files\Acrobat\Reader.exe", _
                           "C:\Program Files (x86)\Acrobat\Reader.exe", _
                           "C:\Program Files\Acrobat\12\Reader.exe")
pat1 = """" & PathToUse & """"

答案 1 :(得分:1)

注册表项是更好的方法,与文件位置不同,它们在系统之间具有一致性。

下面是三个函数,两个支持一个函数,以及一个测试函数的宏。

GetARE() (Get Adob​​e Reader Executable)根据作为参数传递的预定义位置中的版本搜索返回正确的路径。这消除了为每个版本键入许多不同密钥位置的麻烦,并且如果将来的版本发布并安装在用户的系统上,则会提供一定的覆盖范围。

我已经安装了以前版本的Reader来测试InstallPath密钥位置是否存在一致性,直到相当过时的版本为止。事实上,mwolfe02和我都将我们的密钥放在同一个位置,虽然我使用的是版本11,但在撰写本文时,他使用的是10.我只能在x64系统上测试它,但你可以轻松地修改下面的代码以搜索x64和x86密钥。我希望像Adobe这样的大公司能够坚持他们的惯例,所以即使新版本的Reader发布,这项工作也可能会有一段时间没有太多修改。

我写得很快,期望命名约定效率低下和不一致。

确保路径几乎总是返回的最佳方法是使用“* / Acrobat Reader / XX.YY / InstallPath /”在版本号的循环中通过VBA简单地运行注册表搜索,然后包括基于在适当目录中检查适当候选者的可执行文件;然而,这不是一个非常具有成本效益的解决方案。我的测试表明,版本之间存在很大的一致性,可以找到安装路径的位置,以及可执行文件的名称,所以我选择了更有效的东西,如果不那么持久。

RegKeyRead() RegKeyExists() 取自:

http://vba-corner.livejournal.com/3054.html

我没有修改他们的代码。考虑到感谢该帖子的作者,代码并不复杂,但它确实让我省去了自己编写代码的麻烦。

Function RegKeyRead(i_RegKey As String) As String
Dim myWS As Object

  On Error Resume Next
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'read key from registry
  RegKeyRead = myWS.RegRead(i_RegKey)
End Function
Function RegKeyExists(i_RegKey As String) As Boolean
Dim myWS As Object

  On Error GoTo ErrorHandler
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'try to read the registry key
  myWS.RegRead i_RegKey
  'key was found
  RegKeyExists = True
  Exit Function

ErrorHandler:
  'key was not found
  RegKeyExists = False
End Function
Function GetARE(i_RegKey As String) As String
    Dim InPath As String
    Dim InKey As String
    Dim Ind As Integer
    Dim PriVer As String
    Dim SubVer As String
    Dim Exists As Boolean

    Exists = False

    PriVer = 1
    SubVer = 0

    For Ind = 1 To 1000
        If SubVer > 9 Then
            PriVer = PriVer + 1
            SubVer = 0
        End If

        Exists = RegKeyExists(i_RegKey + "\" + PriVer + "." + SubVer + "\InstallPath\")
        SubVer = SubVer + 1

        If Exists = True Then
            SubVer = SubVer - 1
            InKey = i_RegKey + "\" + PriVer + "." + SubVer + "\InstallPath\"
            InPath = RegKeyRead(InKey)
            GetARE = InPath + "\AcroRd32.exe"
            Exit For
        End If
    Next     
End Function


Sub test()
    Dim rando As String

    rando = GetARIP("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Adobe\Acrobat Reader")

    MsgBox (rando)
End Sub

答案 2 :(得分:0)

我记得Acrobat reader曾经包含一些ActiveX PDF阅读器对象,可以与Microsoft Office一起使用。其他公司开发了类似的产品,其中一些(基本形式)甚至免费提供。

那可能是一个解决方案,不是吗?然后,您必须检查您的activeX PDF阅读器是否支持其方法中的直接页面访问,并将其与您的应用程序一起分发,或者将其安装在用户的计算机上。它将避免与acrobat reader版本后续相关的所有开销,特别是当市场上有新版本并且您必须更新客户端界面时。

答案 3 :(得分:0)

只是为了添加到mwolfe02的答案,这里有一个函数试图检索给定文件类型的可执行文件(它还使用注释引用的Levy命令):

Function GetShellFileCommand(FileType As String, Optional Command As String)
Const KEY_ROOT As String = "HKEY_CLASSES_ROOT\"
Dim sKey As String, sProgramClass As String
    ' All File Extensions should start with a "."
    If Left(FileType, 1) <> "." Then FileType = "." & FileType
    ' Check if the File Extension Key exists and Read the default string value
    sKey = KEY_ROOT & FileType & "\"
    If RegKeyExists(sKey) Then
        sProgramClass = RegKeyRead(sKey)
        sKey = KEY_ROOT & sProgramClass & "\shell\"
        If RegKeyExists(sKey) Then
            ' If no command was passed, check the "shell" default string value, for a default command
            If Command = vbNullString Then Command = RegKeyRead(sKey)
            ' If no Default command was found, default to "Open"
            If Command = vbNullString Then Command = "Open"
            ' Check for the command
            If RegKeyExists(sKey & Command & "\command\") Then GetShellFileCommand = RegKeyRead(sKey & Command & "\command\")
        End If
    End If
End Function

所以,

Debug.Print GetShellFileEx("PDF")

输出:

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" "%1"

,您只需将“%1”替换为您要打开的文件,然后添加所需的任何参数。

答案 4 :(得分:0)

以下是您可以使用的代码..

Private Sub CommandButton3_Click()

  Dim strFile As String

  R = 0

  If TextBox7 = "CL" Then
    R = 2
    ' Path and filename of PDF file
    strFile = "E:\Users\Test\Cupertino Current system.pdf"
    ActiveWorkbook.FollowHyperlink strFile
  End If

  if R = 0 Then
    MsgBox "Wrong Code"
    ComboBox1 = ""
    TextBox1 = Empty
    'ComboBox1.SetFocus
  End If

End Sub

只需要正确的道路..希望这可以帮助你