Требуется выгружать в AResponseInfo PDF файл сформированный в LazReport
я могу это сделать через файл
frReport_restests.ExportTo(TlrPDFExportFilter, 'test.pdf' );
AResponseInfo.ServeFile(AContext, 'test.pdf');
А существует ли способ конвернуть результат отчета в pdf в поток? чтобы без сохранения файла сразу отдать потоком.
frReport.ExportTo в Stream возможно?
Модератор: Модераторы
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Готового решения там сейчас нет.
В принципе доработать там не сложно.
Но есть в экспортере в картинки (frPictureExport (кажется так он называется)) есть грязный хак, который подразумевает что экспорт всегда идёт в файл.
В принципе доработать там не сложно.
Но есть в экспортере в картинки (frPictureExport (кажется так он называется)) есть грязный хак, который подразумевает что экспорт всегда идёт в файл.
Вопрос снимается, по причине того, что LazReport все равно отказывается работать в потоках IdHTTPServer1CommandGet
в потоке создаю объекты lazReport по инструкции от FastReport но все равно PrepareReport вылетает с руганью CheckSynchronize called from non-main thread
Получается, что тут либо искать какую-то альтернативу для формирования отчета в PDF,
или делать это в LazReport, который в основном потоке приложения обрабатывает очередь запросов и складирует готовые файлы.
Получается из потока AContext нужно сформировать и поставить задание в очередь, прервать выполнение, дождаться создания файла, и потом его отдавать
Или есть другие методы?
Добавлено спустя 29 секунд:
Вообще, может это в другую тему надо перенести....
в потоке создаю объекты lazReport по инструкции от FastReport но все равно PrepareReport вылетает с руганью CheckSynchronize called from non-main thread
Получается, что тут либо искать какую-то альтернативу для формирования отчета в PDF,
или делать это в LazReport, который в основном потоке приложения обрабатывает очередь запросов и складирует готовые файлы.
Получается из потока AContext нужно сформировать и поставить задание в очередь, прервать выполнение, дождаться создания файла, и потом его отдавать
Или есть другие методы?
Добавлено спустя 29 секунд:
Вообще, может это в другую тему надо перенести....
jsa писал(а):в потоке создаю объекты lazReport по инструкции от FastReport но все равно PrepareReport вылетает с руганью CheckSynchronize called from non-main thread
так надо либо в потоке IdHTTPServer1CommandGet создавать lazReport либо синхронизировать с главным потоком.
можно, если не используется проприетарное библиотека.jsa писал(а):А существует ли способ конвернуть результат отчета в pdf в поток?
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 писал(а):"в потоке создаю объекты lazReport ..."
Это линукс? У меня в линуксе библиотеки TrueType не потокобезопасные оказались при загрузке шрифтов - пришлось их мьютиксировать.
Возможно там проблема.
Решается просто, во время генерации pdf файла, мьютиксоровать выход.
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
