0

我是 MS Access 的新手。我在文本框中有 pdf 文件位置。我想在访问报告加载时,然后在该报告中预览特定的 pdf 文件(从文件位置读取 pdf)。我怎样才能实现它?请帮忙?

4

2 回答 2

1

您可以通过将其页面转换为图像并显示它们来在报告中显示 PDF。您可以在事件wsh.Run期间提取Report_Load,然后将页面路径存储在临时表中。

  1. 安装带有 PDF-Plugin 的 Irfanview。
  2. 在前端,创建一个名为的表TmpExtractedPages,其中一个Short-Text字段命名Path为存储提取页面的路径。
  3. 使用 Record-Source 创建报告。
SELECT TmpExtractedPages.Path FROM TmpExtractedPages;
  1. 在Detail-Section(无页眉/页脚部分)中添加一个适合页面并将其绑定到的Picture-ControlPath
  2. 将以下代码放入Report_Load事件中
Private Sub Report_Load()
Dim TempPath As String
TempPath = CurrentProject.Path & "\TempPdf"

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FolderExists(TempPath) Then
    fso.DeleteFolder TempPath
End If
fso.CreateFolder TempPath

Dim PdfFile As String
PdfFile = Me.OpenArgs

Const PathToIrfanView As String = "C:\Program Files (x86)\IrfanView\i_view32.exe"

Dim CmdArgs As String
CmdArgs = Chr(34) & PdfFile & Chr(34) & " /extract=(" & Chr(34) & TempPath & Chr(34) & ",jpg) /cmdexit" 'see i_options.txt in IrfanView folder for command line options

Dim ShellCmd As String
ShellCmd = Chr(34) & PathToIrfanView & Chr(34) & " " & CmdArgs
Debug.Print ShellCmd

Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")

Const WaitOnReturn As Boolean = True
Const WindowStyle As Long = 0

wsh.Run ShellCmd, WindowStyle, WaitOnReturn

With CurrentDb
    .Execute "Delete * From TmpExtractedPages", dbFailOnError

    Dim f As Object
    For Each f In fso.GetFolder(TempPath).Files
        .Execute "Insert Into TmpExtractedPages (Path) Values ('" & Replace(f.Path, "'", "''")  & "');", dbFailOnError
    Next f
End With

Set fso = Nothing
Set wsh = Nothing
End Sub

您提供 PDF 的路径以OpenArgs在打开的报告中显示为参数:

DoCmd.OpenReport "rpt_pdf", acViewPreview, , , , "path\to\pdf"

请记住,如果您稍后不压缩它(或者只是像我一样在开始时部署一个新的前端副本),那么添加然后删除临时表中的记录会使您的数据库膨胀。

于 2019-11-01T05:25:23.077 回答
0

如果您只需要显示 pdf 文件,您可以在文本框旁边及其点击事件中创建一个按钮:

Private Sub cmdView_Click()
    If Nz(Me.txtPdfLocation) <> "" Then
       Application.FollowHyperlink Me.txtPdfLocation
    End If
End Sub
于 2019-10-03T22:01:11.540 回答