从 Access OLE 对象中提取文件

Extract Files from an Access OLE Object

提问人:Alireza Daneshmayeh 提问时间:8/17/2023 最后编辑:braXAlireza Daneshmayeh 更新时间:8/17/2023 访问量:82

问:

如何从 Access 中的表格中获取这些 pdf 格式的包文件并将它们移动到文件夹中

如果可以的话,请将(产品名称)和(pdf)也导出来,那就太棒了;我知道是否有修复程序;我会的。

例如

enter image description here

这是文件:我创建的文件作为示例。如果可以,请检查一下,让我知道这个文件的问题。另外,请指导我提取PDF文件所需的命令

我在 VBA 中使用了这段代码;没有回答 ;如果编码以外的其他方式也有效;说声谢谢

Sub ExportPDFs()
    Dim rs As DAO.Recordset
    Dim filePath As String
    Dim fileNum As Integer
    
    
    
    Set rs = CurrentDb.OpenRecordset("SELECT pakage FROM Table1 ")
    
    If rs.RecordCount > 0 Then
        filePath = "C:\Users\AliReza\Desktop\folder\"
        
        rs.MoveFirst
        Do Until rs.EOF
            fileNum = FreeFile
            Open filePath & rs.Fields("pakage") & ".pdf" For Output As #fileNum
            Put #fileNum, , rs.Fields("Package").Value
            Close #fileNum
            
            rs.MoveNext
        Loop
    End If
    
    rs.Close
    Set rs = Nothing
End Sub
VBA MS-ACCESS-2010

评论

0赞 braX 8/17/2023
请不要在您的问题中包含指向您的个人谷歌云端硬盘的外部链接。
0赞 June7 8/17/2023
代码有效吗?如果没有,会发生什么 - 错误消息,错误结果,什么都没有?
0赞 Alireza Daneshmayeh 8/17/2023
打开 filePath & rs。字段(“包”)和“.pdf”输出为 #fileNum |此错误是:在此集合中找不到项目 |虽然此名称位于表中,但@june7
0赞 Alireza Daneshmayeh 8/17/2023
打开 filePath & rs。字段(“pakage”) & “.pdf” 输出为 #fileNum |我写列的名称是(pakage);它显示此错误 | 。pakage => erore 是:错误的文件名或编号

答:

0赞 Olivier Jacot-Descombes 8/17/2023 #1

首先,您需要两个不同的列来表示文档的名称(我们称之为 )和存储文档的 OLE 对象 ()。NamePackage

然后,可以使用 将 OLE 对象存储到文件中。ADODB.Stream

Sub ExportPDFs()
    Dim rs As DAO.Recordset
    Dim folder As String, path As String
    Dim adoStream As Object 'Late bound ADODB.Stream
    
    folder = "C:\Users\AliReza\Desktop\folder\"
    Set rs = CurrentDb.OpenRecordset("SELECT Name, Package FROM documents")
    Do Until rs.EOF
        path = folder & rs!Name & ".pdf"
        
        Set adoStream = CreateObject("ADODB.Stream")
        adoStream.Type = 1 'adTypeBinary
        adoStream.Open
        adoStream.Write rs("Package").Value
        adoStream.SaveToFile path, adSaveCreateOverWrite
        adoStream.Close
        
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
End Sub

请参阅:@ErikA使用 ADODB 的方法。流

评论

0赞 Erik A 8/17/2023
这不适用于 OLE 包对象,我认为 OP 具有这些对象,因为它们在表视图中被标记为“包”。这些对象可以包含多个具有文件名的文件,并且需要更复杂的方法来提取数据。最好只使用 Lebans OleToDisk 来做这些。
0赞 Olivier Jacot-Descombes 8/17/2023
我做了一个测试,手动将 PDF 插入到 OLE 对象列中。该条目显示为“Package”,上面的代码有效。问题是是否有办法从此 OLE 对象中提取 PDF 的原始名称?
0赞 Erik A 8/17/2023
这很奇怪,你确定 PDF 是原封不动的,仍然可以阅读吗?当然,您可以将 OLE 字段的二进制内容写入文件,但它应该包含 OLE 标头和压缩文件数据,而不是原始内容。如果 OLE 字段中有原始二进制数据,则它应该显示为“长二进制数据”,而不是“包”,并且无法通过 GUI afaik 创建这些数据
0赞 Olivier Jacot-Descombes 8/17/2023
PDF 的大小确实发生了变化,比原始版本大了 552 字节;但是我可以打开并显示它。我在 Firefox 和 PDF Architect 7 中尝试过。
0赞 Olivier Jacot-Descombes 8/17/2023
二进制编辑器显示新文档确实具有 Package 页眉(和页脚)。显然,提到的应用程序可以打开打包的 PDF 的 .包头包含原始文件路径。因此,确实应该可以从中获取文档名称。