Извлечь объект OLE (pdf) из базы данных Access
Вопрос
Мы обновляем/конвертируем несколько старых баз данных Access в MS-SQL.Многие из этих баз данных имеют поля объектов OLE, в которых хранятся файлы PDF.Я ищу способ извлечь эти файлы и сохранить их в нашей базе данных SQL.Я видел похожие вопросы, в которых говорилось, как это можно сделать с файлами изображений (jpg, bmp, gif и т. д.), но я не нашел способа, который работал бы с PDF.
Решение
Я наконец-то получил код, работающий на то, что я хочу. Хитрость заключается в том, чтобы определить, какая часть является заголовком OLE, и удалить его. Вот что работает для меня (на основе найденного кода здесь )
public static byte[] StripOleHeader(byte[] fileData)
{
const string START_BLOCK = "%PDF-1.3";
int startPos = -1;
Encoding u8 = Encoding.UTF7;
string strEncoding = u8.GetString(fileData);
if (strEncoding.IndexOf(START_BLOCK) != -1)
{
startPos = strEncoding.IndexOf(START_BLOCK);
}
if (startPos == -1)
{
throw new Exception("Could not find PDF Header");
}
byte[] retByte = new byte[fileData.LongLength - startPos];
Array.Copy(fileData, startPos, retByte, 0, fileData.LongLength - startPos);
return retByte;
}
Обратите внимание, что это работает только для файлов PDF.
Другие советы
ОЛЕтоДиск
«Эта версия сохраняет все содержимое таблицы, содержащей объекты OLE, на диск.НЕ требует, чтобы исходное приложение, служившее OLE-сервером, для вставки объекта.Поддерживает все документы MS Office, PDF, все изображения, вставленные с помощью MS Photo Editor, MS Paint и Paint Shop Pro.Также поддерживает извлечение класса PACKAGE, включая исходное имя файла.Содержит функцию для создания полной инвентаризации поля OLE, включая СВЯЗАННЫЙ путь и имена файлов.Использует API структурированного хранилища для чтения фактического содержимого поля».