WORD, EXCEL, PDF и BMP в IBSO
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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
|
|
 |
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 появляются вставки из последовательностей разных символов.
Если убрать заголовок, хвост и эти вставки, то файл становится идентичным первоначальному.
Дело за малым - создать универсальный механизм удаления этих последовательностей из конечных файлов... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|