Как открыть PDF-файл, хранящийся в поле sql server [image], используя ms access 2007 - PullRequest
1 голос
/ 09 ноября 2011

Я конвертирую базу данных из доступа к интерфейсу доступа SQL Server.База данных имеет встроенные PDF-документы, которые в конечном итоге сохраняются в виде данных [изображения] с помощью инструментов импорта данных SQL-сервера.

Моя проблема заключается в том, что я хочу, чтобы пользователи могли открывать PDF-файл, щелкая значок PDFв отчете, созданном в Access.

Можно ли это сделать с помощью VBA или существует более простой способ?Я в полном недоумении, как это сделать.

Спасибо за ответ!

Я отредактировал функцию BlobToFile, чтобы убрать заголовок ole, так как Adobe не может прочитать файл(evince мог и так мог mac mac preview)

Я смог сделать то, что хотел, вот так:

 Private Sub PDFDocument_Click()
     Call BlobToFile("C:\db\MyPDFFile.pdf", Me.PDFDocument)
     If Dir("C:\db\MyPDFFile.pdf") <> "" Then
        FollowHyperlink ("C:\db\MyPDFFile.pdf")
     End If
 End Sub

 'Function:  BlobToFile - Extracts the data in a binary field to a disk file.
 'Parameter: strFile - Full path and filename of the destination file.
 'Parameter: Field - The field containing the blob.
 'Return:    The length of the data extracted.
  Public Function BlobToFile(strFile As String, ByRef Field As Object) As Long
     On Error GoTo BlobToFileError

     Dim nFileNum As Integer
     Dim abytData() As Byte
     Dim abytParsedData() As Byte
     Dim copyOn As Boolean
     Dim copyIndex As Long

     BlobToFile = 0
     nFileNum = FreeFile
     copyOn = False
     copyIndex = 0

     Open strFile For Binary Access Write As nFileNum
     abytData = Field
     ReDim abytParsedData(UBound(abytData))

     For i = LBound(abytData) To UBound(abytData) - 1
         If copyOn = False Then
             If Chr(abytData(i)) = "%" And Chr(abytData(i + 1)) = "P" And Chr(abytData(i + 2)) = "D" And Chr(abytData(i + 3)) = "F" Then
                 copyOn = True
             End If
         End If

         If copyOn = True Then
             abytParsedData(copyIndex) = abytData(i)
             copyIndex = copyIndex + 1
         End If
     Next

     Put #nFileNum, , abytParsedData

     BlobToFile = LOF(nFileNum)

     BlobToFileExit:
     If nFileNum > 0 Then Close nFileNum
          Exit Function

     BlobToFileError:
     MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
            "Error writing file in BlobToFile"
     BlobToFile = 0
     Resume BlobToFileExit

 End Function

1 Ответ

2 голосов
/ 10 ноября 2011

Если я понимаю, что вы пытаетесь сделать, вы, в основном, хотите, чтобы Adobe Reader открывал «объект» pdf-файла в памяти.Это невозможноВам нужно будет записать файл PDF на системный жесткий диск, а затем открыть его оттуда.Вы можете в некоторой степени добиться того, что вы просите, используя папку Temp на компьютере или самостоятельно управляя файлами / папкой.Например, вы можете очищать папку с файлами PDF при каждом открытии приложения.

Вот код, который поможет вам сделать то, что вы пытаетесь сделать.Этот код не имеет ничего общего с созданием папок, генерацией имен файлов, проверкой, существует ли файл и т. Д. Я предполагаю, что вы сможете справиться с этим.Мой код в Command1_Click предполагает, что вы используете SQL Server со связанными таблицами ODBC.

Я использую здесь FollowHyperlink, но я настоятельно рекомендую вместо этого использовать функцию GoHyperlink Аллена Брауна для открытия файлов,Вероятно, у вас будут ошибки безопасности с FollowHyperlink.

Private Sub Command1_Click()
    Dim r As DAO.Recordset, sSQL As String
    sSQL = "SELECT ID, BlobField FROM MyTable"
    Set r = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges)
    If Not (r.EOF And r.BOF) Then
        Call BlobToFile("C:\MyPDFFile.pdf", r("BlobField"))
        If Dir("C:\MyPDFFile.pdf") <> "" Then
            FollowHyperlink("C:\MyPDFFile.pdf")
        End If
    End If
    r.Close
    Set r = Nothing
End Sub


'Function:  BlobToFile - Extracts the data in a binary field to a disk file.
'Parameter: strFile - Full path and filename of the destination file.
'Parameter: Field - The field containing the blob.
'Return:    The length of the data extracted.
Public Function BlobToFile(strFile As String, ByRef Field As Object) As Long
    On Error GoTo BlobToFileError

    Dim nFileNum As Integer
    Dim abytData() As Byte
    BlobToFile = 0
    nFileNum = FreeFile
    Open strFile For Binary Access Write As nFileNum
    abytData = Field
    Put #nFileNum, , abytData
    BlobToFile = LOF(nFileNum)

BlobToFileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function

BlobToFileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
           "Error writing file in BlobToFile"
    BlobToFile = 0
    Resume BlobToFileExit

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...