frReport.ExportTo в Stream возможно?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

frReport.ExportTo в Stream возможно?

Сообщение jsa » 23.04.2020 10:01:02

Требуется выгружать в AResponseInfo PDF файл сформированный в LazReport
я могу это сделать через файл

frReport_restests.ExportTo(TlrPDFExportFilter, 'test.pdf' );
AResponseInfo.ServeFile(AContext, 'test.pdf');

А существует ли способ конвернуть результат отчета в pdf в поток? чтобы без сохранения файла сразу отдать потоком.
jsa
постоялец
 
Сообщения: 146
Зарегистрирован: 28.11.2017 13:46:04

Re: frReport.ExportTo в Stream возможно?

Сообщение alexs » 23.04.2020 11:26:22

Готового решения там сейчас нет.
В принципе доработать там не сложно.
Но есть в экспортере в картинки (frPictureExport (кажется так он называется)) есть грязный хак, который подразумевает что экспорт всегда идёт в файл.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3912
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: frReport.ExportTo в Stream возможно?

Сообщение jsa » 23.04.2020 17:29:59

Вопрос снимается, по причине того, что LazReport все равно отказывается работать в потоках IdHTTPServer1CommandGet
в потоке создаю объекты lazReport по инструкции от FastReport но все равно PrepareReport вылетает с руганью CheckSynchronize called from non-main thread

Получается, что тут либо искать какую-то альтернативу для формирования отчета в PDF,
или делать это в LazReport, который в основном потоке приложения обрабатывает очередь запросов и складирует готовые файлы.
Получается из потока AContext нужно сформировать и поставить задание в очередь, прервать выполнение, дождаться создания файла, и потом его отдавать

Или есть другие методы?

Добавлено спустя 29 секунд:
Вообще, может это в другую тему надо перенести....
jsa
постоялец
 
Сообщения: 146
Зарегистрирован: 28.11.2017 13:46:04

Re: frReport.ExportTo в Stream возможно?

Сообщение olegy123 » 24.04.2020 15:09:20

jsa писал(а):в потоке создаю объекты lazReport по инструкции от FastReport но все равно PrepareReport вылетает с руганью CheckSynchronize called from non-main thread

так надо либо в потоке IdHTTPServer1CommandGet создавать lazReport либо синхронизировать с главным потоком.

jsa писал(а):А существует ли способ конвернуть результат отчета в pdf в поток?
можно, если не используется проприетарное библиотека.
olegy123
долгожитель
 
Сообщения: 1568
Зарегистрирован: 25.02.2016 12:10:20

Re: frReport.ExportTo в Stream возможно?

Сообщение jsa » 24.04.2020 16:48:52

olegy123 писал(а):так надо либо в потоке IdHTTPServer1CommandGet создавать lazReport

см. выше, я так и написал "в потоке создаю объекты lazReport ..."

olegy123 писал(а):либо синхронизировать с главным потоком.

уже не помню точно какие, но тоже проблемы были.

olegy123 писал(а):можно, если не используется проприетарное библиотека.

Уже не актуально, т.к. файлы оказались кстати.

Т.к. сама задача предоставляла возможность, сделал проще.
0. LazReport работает в основном потоке.
1. Всегда перед запросом конкретной PDF запрашивается список этих отчетов. Список не большой от 1 до примерно 20-30 позиций.
2. в Методе выдачи списка, заполняется спец.таблица ListPDF с идентификаторами отчетов и пустым полем "имя файла".
3. Метод в конце посылает сообщение PostMessage который ловится в основном потоке.
4. из ListPDF делается выборка записей с пустым полем "имя файла"
5. LazReport в цикле формирует PDF-ки сохраняя их в определенную папку , а имена записывается в ListPDF
6. к тому моменту когда прилетает запрос на конкретную PDF файлы уже готовы.
7. если файл не готов то в потоке обработки запроса PDF делается sleep 10 раз , а там или файл уже появится или будет возврат сообщения об отсутствии файла.
jsa
постоялец
 
Сообщения: 146
Зарегистрирован: 28.11.2017 13:46:04

Re: frReport.ExportTo в Stream возможно?

Сообщение olegy123 » 25.04.2020 11:28:44

jsa писал(а):"в потоке создаю объекты lazReport ..."
можно код?

Это линукс? У меня в линуксе библиотеки TrueType не потокобезопасные оказались при загрузке шрифтов - пришлось их мьютиксировать.
Возможно там проблема.

Решается просто, во время генерации pdf файла, мьютиксоровать выход.
olegy123
долгожитель
 
Сообщения: 1568
Зарегистрирован: 25.02.2016 12:10:20

Re: frReport.ExportTo в Stream возможно?

Сообщение jsa » 27.04.2020 06:06:12

olegy123 писал(а):можно код?

вот
Код: Выделить всё
...
CrSection.Enter;

frReport_thread := TfrReport.Create(nil);               // Создаем объект
{ из инструкции к FR в LR не работает
frReport_thread.SilentMode := True;       // Запрещаем вывод различных сообщений
frReport_thread.EngineOptions.EnableThreadSafe := True; // Опция многопоточности, проверяется в некоторых местах при построении отчета
frReport_thread.EngineOptions.UseFileCache := false;            // Использование файлового кеша при построении отчетов
frReport_thread.ShowProgress := False;                          // Запрещаем показ прогресс бара
}
frDBDataSet_thread := TfrDBDataSet.Create(nil); 
frDBDataSet_thread.DataSet:=query;                         
//frReport_thread.Dataset:=frDBDataSet_thread;

AResponseInfo.ContentType := 'application/pdf';           

query.Open;                                             
if frReport_thread.PrepareReport() then
   begin
   filepdf:='test_'+FormatDateTime('yyyy-mm-dd_hh:nn:ss.zzz', Now)+'.pdf' ;
   frReport_thread.ExportTo(TlrPDFExportFilter, filepdf );

   AResponseInfo.ServeFile( AContext, filepdf  );   
   AResponseInfo.ResponseNo := 200;
   end;
query.Close;
frReport_thread.Free;
frDBDataSet_thread.Free;

CrSection.Leave;
...


Этот проект делаю в винде8
jsa
постоялец
 
Сообщения: 146
Зарегистрирован: 28.11.2017 13:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru