Извлечь объект OLE (pdf) из Access DB

Мы обновляем / конвертируем несколько старых баз данных Access в MS-SQL. Многие из этих баз данных имеют поля OLE Object, в которых хранятся файлы PDF. Я ищу способ извлечь эти файлы и сохранить их в нашей базе данных SQL. Я встречал похожие вопросы, которые дают ответ на то, как это можно сделать с файлами изображений (jpg, bmp, gif и т. Д.), Но я не нашел способа, который работает с PDF.


person Nate    schedule 22.06.2009    source источник


Ответы (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.

person Nate    schedule 23.06.2009
comment
Поскольку это более старый ответ, этот код работал у меня, мне нужно было только обновить% PDF-1.3 до% PDF-1.7, и он смог правильно вырезать заголовок. Как ни странно, это сработало и при поиске% PDF ... - person Arthurdent510; 03.04.2017

OLEtoDisk

«Эта версия сохраняет все содержимое таблицы, содержащей объекты OLE, на диск. НЕ требует, чтобы исходное приложение, которое служило сервером OLE, вставляло объект. Поддерживает все документы MS Office, PDF, все изображения, вставленные с помощью MS Photo Editor, MS Paint и Paint Shop Pro. Также поддерживает извлечение класса PACKAGE, включая исходное имя файла. Содержит функцию для создания полной инвентаризации поля OLE, включая СВЯЗАННЫЙ путь и имена файлов. Использует API структурированного хранилища для чтения фактического содержимого поля »

http://lebans.com/oletodisk.htm

person Tony Toews    schedule 23.06.2009
comment
Я видел (и пробовал) это. Он работает, чтобы вытащить PDF-файлы, но я пытаюсь найти что-то, что я могу интегрировать в свой собственный (C #) код. Некоторые из этих баз данных Access имеют 4+ столбца, в которых хранятся файлы PDF, и в конечном итоге я просто хочу скопировать файл в таблицу на нашем сервере SQL со всеми другими данными. - person Nate; 23.06.2009