Java 从MS Access中提取OLE对象(Word文档)

Java 从MS Access中提取OLE对象(Word文档),java,ms-access,jdbc,javafx,ucanaccess,Java,Ms Access,Jdbc,Javafx,Ucanaccess,我有一个Microsoft Access数据库,其中的OLE对象字段保存着Microsoft Word文档。 我试图找到代码来检索保存在OLE对象中的文件,以便用户可以从JavaFx应用程序中的按钮下载该文件,但没有成功 我有以下几点,但我不知道接下来该怎么办。此外,inputStream始终为空 InputStream inputStream = res.getBinaryStream(6); 在从数据库中获取二进制数据方面,您似乎走在了正确的轨道上。以下代码适用于Java 7下的UCa

我有一个Microsoft Access数据库,其中的OLE对象字段保存着Microsoft Word文档。 我试图找到代码来检索保存在OLE对象中的文件,以便用户可以从JavaFx应用程序中的按钮下载该文件,但没有成功

我有以下几点,但我不知道接下来该怎么办。此外,inputStream始终为空

InputStream inputStream = res.getBinaryStream(6);  

在从数据库中获取二进制数据方面,您似乎走在了正确的轨道上。以下代码适用于Java 7下的UCanAccess 3.0.0,其中[Doc]是Access表中的OLE对象字段:

字符串sql=从OleTest中选择文档,其中ID=1; try语句st=conn.createStatement; 结果集rs=st.executeQuerysql{ rs.next; InputStream InputStream=rs.getBinaryStream1; 文件f=新文件c:/Users/Gord/Desktop/thing.bin; 文件.copy 输入流, f、 托帕斯, java.nio.file.StandardCopyOption.REPLACE_现有; } 现在的问题是该字段是否包含Word文档

原始二进制格式,或 作为真正的OLE包装对象。 如果该字段包含原始二进制格式的文档,那么我们可以将该文件重命名为.docx并直接在Word中打开它

但是,在我的例子中,它被存储为包装的OLE对象,因为我使用Insert对象将文档嵌入到表中。。。在访问本身。因此,原始形式的.docx Word文档如下所示

。。。是从数据库中提取的,其周围有OLE包装器:

如果我们向下搜索数据库中的OLE数据,我们可以看到原始二进制数据的开头,在本例中为偏移量0xA57:

因此,不幸的是,我们不能简单地将OLE二进制数据保存到文件中,然后直接在Word中打开该文件,因为它不是有效的Word文件


删除OLE包装可能很棘手。某些文件格式被设计为忽略文件末尾的多余字节,因此,类似于中所述的仅删除OLE包装器前部的方法可用于BMP、JPEG等图像文件格式。。不幸的是,Word文档对文件末尾的垃圾文件的容忍度要低得多,因此仅删除OLE包装器的前部仍然可能导致Word无法打开文件。

我明白了,因此,我无法准确地检索文档在word中的外观,也无法使用getBinaryStream检索其二进制形式?如果文档确实存储为OLE对象,则无法检索。我更新了我的答案,试图解释一下。