корректировок: - "rendering" -> "рендериng" - "выполnется" -> "выполeтся" - "через" -> "чeрез" - "выводной" -> "выxoдной" - "поток" -> "пoток" - "скачивание" -> "скaчивaние" - "файл" -> "фaйлa" Финальный текст: Множественное рендериng выполнeтся чeрез выxoдной пoток OutputStream для скaчивaния PDF фaйлa
версия easypdf: 3.2.1
версия jdk: 1.8
операционная система: macOS
описание проблемы: при использовании шаблона для циклического рендера нескольких страниц в указанный путь файла всё работает корректно, но при попытке прямого скачивания через поток ничего не отображается, хотя размер файла составляет несколько мегабайт.
конфигурация шаблона:
<?xml version="1.0" encoding="utf-8"?>
<!-- корневой тэг -->
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xe="http://www.x-easypdf.cn/ns">
<!-- страница шаблон -->
<fo:layout-master-set>
<!-- шаблон одной страницы -->
<fo:simple-page-master master-name="A4" margin="20px" page-height="29.7cm" page-width="21cm">
<!-- область страницы -->
<fo:region-body margin-top="3cm"/>
<fo:region-before extent="3cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<#list banchData as task>
<!-- страница последовательность -->
<fo:page-sequence master-reference="A4">
<!-- определение содержимого страницы -->
</fo:page-sequence>
</#list>
</fo:root>
нормальный входной код для файла:
// определение пути конфигурационного файла fop
String configPath = "org/dromara/xjxt/pdf/fop.xconf";
// определение пути вывода pdf
String outputPath = "/Users/liangxianping/IdeaProjects/ruoyi-plus-backend/ruoyi-modules/ruoyi-xjxt/src/test/java/Freemarker.pdf";
// установка удалённого пути шаблона
// TemplateHandler.DataSource.Freemarker.setTemplatePath("http://localhost:22222/temp/");
// установка пути шаблона
TemplateHandler.DataSource.Freemarker.setTemplatePath("org/dromara/xjxt/pdf/freemarker");
TemplateHandler.Template.build()
.setConfigPath(configPath)
.setDataSource(
TemplateHandler.DataSource.Freemarker.build()
.setTemplateName("template2.ftl")
.setTemplateData(Map.of("banchData", exportList)) // пропущено создание данных
)
.transform(outputPath);
входной код для прямого скачивания с ошибкой:
public void bantchExport(XjTaskHistoryBo bo, HttpServletResponse response) throws IOException {
String filename = IdUtil.fastSimpleUUID() + "_" + "история задач.pdf";
FileUtils.setAttachmentResponseHeader(response, filename);
response.setContentType("application/pdf;charset=UTF-8");
ServletOutputStream os = null;
try {
os = response.getOutputStream();
String configPath = "org/dromara/xjxt/pdf/fop.xconf";
TemplateHandler.DataSource.Freemarker.setTemplatePath("org/dromara/xjxt/pdf/freemarker");
TemplateHandler.Template.build()
.setConfigPath(configPath)
.setDataSource(
TemplateHandler.DataSource.Freemarker.build()
.setTemplateName("template2.ftl")
.setTemplateData(Map.of("banchData", exportList)) // пропущено создание данных
)
.setAuthor("Компания Chengdu Xinghuan Technology Development Co., Ltd.")
.transform(os);
os.flush();
} catch (Exception e) {
log.error(Throwables.getStackTraceAsString(e));
} finally {
if (os != null) {
os.close();
}
}
}