Мы обновляем / конвертируем несколько старых баз данных Access в MS-SQL. Многие из этих баз данных имеют поля OLE Object, в которых хранятся файлы PDF. Я ищу способ извлечь эти файлы и сохранить их в нашей базе данных SQL. Я встречал похожие вопросы, которые дают ответ на то, как это можно сделать с файлами изображений (jpg, bmp, gif и т. Д.), Но я не нашел способа, который работает с PDF.
Извлечь объект OLE (pdf) из Access DB
Ответы (2)
Наконец-то я получил код, работающий для того, что я хочу. Хитрость заключается в том, чтобы определить, какая часть является заголовком 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.
OLEtoDisk
«Эта версия сохраняет все содержимое таблицы, содержащей объекты OLE, на диск. НЕ требует, чтобы исходное приложение, которое служило сервером OLE, вставляло объект. Поддерживает все документы MS Office, PDF, все изображения, вставленные с помощью MS Photo Editor, MS Paint и Paint Shop Pro. Также поддерживает извлечение класса PACKAGE, включая исходное имя файла. Содержит функцию для создания полной инвентаризации поля OLE, включая СВЯЗАННЫЙ путь и имена файлов. Использует API структурированного хранилища для чтения фактического содержимого поля »
http://lebans.com/oletodisk.htm