CftClub.ru
Клуб специалистов ЦФТ-Банк

WORD, EXCEL, PDF и BMP в IBSO

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
MARINA KRAMARENKO
Участник


Вступление в Клуб: 26.08.2013
СообщениеПн Авг 26, 2013 16:07   WORD, EXCEL, PDF и BMP в IBSO Ответить с цитатой
Полезность: Нет оценки
Не совсем понятны следующие моменты:

Что происходит с файлами WORD, EXCEL, PDF и BMP при сохранении их в IBSO?
Какие преобразования они претерпевают?
Как лучше реализовать в IBSO механизм для выгрузки документов WORD, EXCEL, PDF и BMP, хранящихся в системе, обратно в файлы?
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПн Авг 26, 2013 16:18    Ответить с цитатой
Полезность: Нет оценки
Сохраняются как blob объект. Раздувают базу в случае активного использования.
Вы уверены что именно хотите сохранять как оракловый объект?
В ЦФТ есть операция в клиентах "Загрузить карточку образцов подписи" вам для примера.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеПн Авг 26, 2013 17:22    Ответить с цитатой
Полезность: Нет оценки
Я так понял, вопрос был об OLE объектах? MS дописывает к телу файла заголовок и окончание. Как файл вернуть в исходное состояние - пока не понятно. Можно конечно вырезать заголовок до известных символов начала файла - но не всегда и не со всеми файлами это работает.
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеВт Авг 27, 2013 02:38    Ответить с цитатой
Полезность: Нет оценки
Почему бы файлы не хранить на отдельном сервере а в ибсо только ссылку ?
MARINA KRAMARENKO
Участник


Вступление в Клуб: 26.08.2013
СообщениеВт Авг 27, 2013 08:50    Ответить с цитатой
Полезность: Нет оценки
В файлах WORD нужно убрать первые 32 символа, и они будут без проблем открываться.
С PDF сложнее - добавляются не только заголовки, но и вставки по всей длине файла... Файлы потом не открываются Adobe Reader...
Может кто-нибудь сталкивался с подобной проблемой?
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 27, 2013 09:27    Ответить с цитатой
Полезность: Нет оценки
На одном из прошлых проектов писали операцию просмотра любых файлов из BLOB. Ниже приведен пример кода операции:

Код:
========================================================================================
=                                                                                      =
=                                  Переменные операции                                 =
= Position, Name, ShortName, ClassId, Default Value, Flag, Bingings, Criterion Formula =
=                                                                                      =
========================================================================================

1,'v_file_io',V_FILE_IO,FILE$LOAD,'',D
2,'v_file_path',V_FILE_PATH,STRING_2000,'',D
3,'v_file_name',V_FILE_NAME,STRING_255,'',D
4,'EXCEL_PATH',EXCEL_PATH,STRING_255,'',D

============================================================
=                                                          =
=                    Проверка параметров                   =
=                                                          =
============================================================

begin
   -- debug_pipe('<' || this || '>', 0);
   if p_message = 'VALIDATE' then
      if p_info = 'COPY_FILE' then
         v_file_io.[DST_DELETE] := false;
         v_file_io.[DST_TYPE] := false;
         v_file_io.[SRC_PATH] := nvl(stdio.get_resource('DEFAULT','FIO_HOME_DIR'),'/u') ||
            nvl(stdio.get_resource('DEFAULT','FIO_ROOT_DIR'),'/utlfile/fio');
         v_file_io.[SRC_DELETE] := false;
         v_file_io.[SRC_TYPE] := true;
         v_file_io.[SRC_NAME] := owner || lpad(next_value('FILE_SEQUENCE'),10,'0')||'.tmp';
         -- выгружаем в файл
         [DT].blob2file(this.[BLOB_VAL], v_file_io.[SRC_PATH], v_file_io.[SRC_NAME]);

         -- копируем на клиента
         v_file_io.[DST_PATH] := v_file_path || '\';
         v_file_io.[DST_NAME] := this.[FILENAME];
         stdio.put_line_buf('<%PLPCALL [BLOB_FILE].FILE_COPY(%PARAM%.P=>%VAR%.V_FILE_IO)%>');
         
         -- Запомним имя файла и путь к нему, по другому не понимает.
         v_f_name := v_file_io.[DST_NAME];
         v_f_path := v_file_io.[DST_PATH];
         
      elsif p_info = 'OPEN_FILE' then
         -- открываем файл
         if instr(v_file_io.[DST_NAME],'.xls') > 0 then
            stdio.put_line_buf('<% shell '||EXCEL_PATH||' "'|| v_f_path || v_f_name ||'" %>');
         else
            stdio.put_line_buf('<% shell_command start " " "'|| v_f_path || v_f_name ||'" %>');
         end if;
      end if;
   end if;
end;

============================================================
=                                                          =
=                    Локальные описания                    =
=                                                          =
============================================================

v_f_name   string;
v_f_path   string;

============================================================
=                                                          =
=                      Клиент-скрипт                       =
=                                                          =
============================================================

Public Function Main(LastControl)
   If LastControl Is Nothing Then
      ' Действия при загрузке формы
      Set FSO = CreateObject("Scripting.FileSystemObject")
      V_FILE_PATH.Text = FSO.GetSpecialFolder(2) & "\" & FSO.GetBaseName(FSO.GetTempName)
      FSO.CreateFolder V_FILE_PATH.Text
      ' получим путь к экселю - для просмотра отчетов
      Set WshShell = CreateObject("WScript.Shell")
       str = WshShell.RegRead("HKCR\.xls\")
      str = WshShell.RegRead("HKCR\"&str&"\shell\Open\command\")
      EXCEL_PATH = str
      
      If Form1.ScriptServerValidate(Nothing, "COPY_FILE") Then
         Form1.ScriptServerValidate Nothing, "OPEN_FILE"
      End If
      Main = NULL
      Exit Function
   Else
      ' Действия при потере фокуса валидируемого контрола LastControl

   End If
   Main = True 'Результат валидатора (True, False, NULL)   
End Function


Процедура blob2file

Код:
procedure blob2file(p_blob BLOB, p_filedir varchar2, p_filename varchar2) is
v_fd integer;
amount integer := 32000;
offset integer := 1;
buffer raw(32000);
begin
   v_fd := stdio.f_open(p_filedir||'/'||p_filename, 'w');
   begin
      loop
         dbms_lob.read(p_blob, amount, offset, buffer);
      exit when amount <= 0;
         stdio.f_write(v_fd, buffer);

         offset := offset + amount;
      end loop;
   exception when others then
      null;
--      pragma debug(sqlerrm);
   end;
   stdio.f_close(v_fd);
end;

_________________
всегда есть как минимум 2 выхода


Последний раз редактировалось: Alexsey (Вт Авг 27, 2013 16:57), всего редактировалось 1 раз
MARINA KRAMARENKO
Участник


Вступление в Клуб: 26.08.2013
СообщениеВт Авг 27, 2013 09:50    Ответить с цитатой
Полезность: Нет оценки
Я тоже использую процедуру blob2file, и файлы на диск сохраняются.
Но PDF и XLS потом не открываются, да и выглядят они уже совсем не так, как до загрузки в ИБСО...
Может нужен какой-нибудь конвертер?
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 27, 2013 09:58    Ответить с цитатой
Полезность: Нет оценки
MARINA KRAMARENKO пишет:
Я тоже использую процедуру blob2file, и файлы на диск сохраняются.
Но PDF и XLS потом не открываются, да и выглядят они уже совсем не так, как до загрузки в ИБСО...
Может нужен какой-нибудь конвертер?

Не могу на это ничего сказать. Все файлы открываются без проблем от картинок, до PDF.
_________________
всегда есть как минимум 2 выхода
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Авг 27, 2013 11:55    Ответить с цитатой
Полезность: Нет оценки
Объекты OLE, сохраненные в виде файла, открываются без проблем?
kykyRyky
Участник


Вступление в Клуб: 27.08.2013
СообщениеВт Авг 27, 2013 16:32    Ответить с цитатой
Полезность: Нет оценки
добрый день!

вот здесь аналогичная проблема, описано как можно конвертнуть некоторые типы файлов из OLE package:
http://www.sql.ru/forum/718887/sohranenie-vnedrenny-ole-obektov-v-fayly
А вот тема, где ув. lexus решает ту же задачу:
http://www.cftclub.ru/viewtopic.php?t=487&sid=4f2e1cbe91126035817c72c22e98d307
Вот бы он поделился своими результатами Smile
lexus
Профи


Вступление в Клуб: 28.09.2007
СообщениеСр Авг 28, 2013 17:26    Ответить с цитатой
Полезность: Нет оценки
Давно это было. Важные тонкости не вспомню сходу (
Но, как упоминалось выше, пришлось отрезать добавленные заголовки у части файлов. В-общем, долго дело шло, но все получилось.

Целиком код не сохранился, может кусок поможет.
Сначала LOB получаем
Код:

-- begin pl/sql
begin
INSERT INTO IBS.TBL_BLOB(DATA) (SELECT to_lob(ld.DATA) FROM ibs.LONG_DATA LD WHERE LD.ID = ec);
commit;
SELECT DATA into file_data FROM TBL_BLOB;
end;
-- end pl/sql

И потом уже его с помощью
Код:

dbms_lob.read(file_data, br, bp, buf);
str := utl_raw.cast_to_varchar2(buf);
buf:=utl_raw.cast_to_raw(str);
stdio.f_write(file, buf);

обрабатываем.
kykyRyky
Участник


Вступление в Клуб: 27.08.2013
СообщениеЧт Авг 29, 2013 09:48    Ответить с цитатой
Полезность: Нет оценки
lexus, сохранение в файл как раз не вызвало проблем. А вот дальше.. То есть пути легче, чем разбирать полученный файл, вырезать из него заголовок и т.д. ты не нашел? И придется вручную для каждого типа используемых файлов превращать их из ole-вложения в соответствующий .doc, .bmp и т.д.?
lexus
Профи


Вступление в Клуб: 28.09.2007
СообщениеЧт Авг 29, 2013 10:15    Ответить с цитатой
Полезность: Нет оценки
kykyRyky пишет:
lexus, сохранение в файл как раз не вызвало проблем. А вот дальше.. То есть пути легче, чем разбирать полученный файл, вырезать из него заголовок и т.д. ты не нашел? И придется вручную для каждого типа используемых файлов превращать их из ole-вложения в соответствующий .doc, .bmp и т.д.?

Да, так. Обрабатывал каждый тип файлов отдельно
MARINA KRAMARENKO
Участник


Вступление в Клуб: 26.08.2013
СообщениеСр Сен 04, 2013 10:38    Ответить с цитатой
Полезность: Нет оценки
У некоторых PDF бывает достаточно убрать заголовок и хвост, чтобы файл потом нормально открывался с помощью Adobe Reader. Некоторые файлы открываются только с помощью PDFMaster. Некоторые - открываются, но страницы при просмотре обрезаются...
В самом тексте файла после обработки IBSO появляются вставки из последовательностей разных символов.
Если убрать заголовок, хвост и эти вставки, то файл становится идентичным первоначальному.
Дело за малым - создать универсальный механизм удаления этих последовательностей из конечных файлов...
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru