2015-08-15 8 views
2

У меня есть база данных Microsoft Access с полем OLE Object с документом Microsoft Word. Я попытался найти код для извлечения файла, сохраненного в OLE-объекте, так что пользователь может загрузить его с помощью кнопки в моем приложении JavaFx, но я не имел успеха.Извлечь объект OLE (документ Word) из MS Access

У меня есть следующее, но я не знаю, что делать после этого. Кроме того, inputStream всегда имеет значение null.

InputStream inputStream = res.getBinaryStream(6); 

ответ

4

Вы, кажется, находитесь на правильном пути в отношении получения двоичных данных из базы данных. Следующий код работает для меня с UCanAccess 3.0.0 под Java 7, где [Doc] является OLE Object поля в Access таблице:

String sql = "SELECT Doc FROM OleTest WHERE ID=1"; 
try (Statement st = conn.createStatement(); 
     ResultSet rs = st.executeQuery(sql)) { 
    rs.next(); 
    InputStream inputStream = rs.getBinaryStream(1); 
    File f = new File("C:/Users/Gord/Desktop/thing.bin"); 
    Files.copy(
      inputStream, 
      f.toPath(), 
      java.nio.file.StandardCopyOption.REPLACE_EXISTING); 
} 

Теперь вопрос, содержит ли поле документа Word,

  1. в необработанном двоичном формате, или
  2. как истинный OLE («завернутый») объект.

Если поле содержало документ в двоичном формате, то мы могли бы просто переименовать файл в .docx и открыть его непосредственно в Word.

Однако в моем случае он был сохранен как «завернутый» OLE-объект, потому что я вложил документ в таблицу, используя «Вставить объект ...» в сам доступ. Поэтому .docx (Word) документ, который в сыром виде выглядит так ...

raw.png

... извлекается из базы данных с "OLE обертку" вокруг него:

wrapped1.png

Если мы ищем вниз через данные OLE из базы данных мы можем увидеть начало необработанных двоичных данных, в этом случае при смещении 0xA57:

wrapped2.png

Итак, к сожалению, мы не можем просто сохранить двоичные данные OLE в файл, а затем открыть этот файл непосредственно в Word, потому что он не является допустимым файлом Word.

Удаление OLE «обертки» может быть сложным. Некоторые форматы файлов предназначены для игнорирования посторонних байтов в конце файла, поэтому такие подходы, как описанные в this answer (который просто удаляет «переднюю часть» OLE-оболочки), могут использоваться с форматами файлов изображений, такими как BMP, JPEG, и т. д. К сожалению, документы Word гораздо менее прощают «мусор» в конце файла, поэтому просто удаление «передней части» OLE-оболочки может по-прежнему приводить к файлу, который Word не может открыть.

+0

Я вижу, поэтому я не смогу получить документ точно так, как это выглядит в слове, а не его двоичной форме с помощью getBinaryStream()? – whites

+0

Не, если документ действительно был сохранен как объект OLE. Я обновил свой ответ, чтобы попытаться объяснить. –

Смежные вопросы