You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将EL作为独立模板语言配合Flying Saucer生成PDF

结论

完全可以实现该需求。Flying Saucer本身的核心能力是将合规的XHTML内容渲染为PDF,本身不内置EL表达式解析能力,你只需要在将模板传给Flying Saucer之前,先完成EL表达式的解析替换步骤即可,整体流程和你给出的伪代码逻辑完全一致。


1. 实现逻辑说明

你可以直接使用Java标准EL API(javax.el或jakarta.el)完成表达式解析,也可以用成熟的模板引擎(如Thymeleaf、FreeMarker)完成模板渲染,再将处理完成的纯XHTML内容传给Flying Saucer生成PDF即可。

2. 模板文件示例

src/WebContent/test.xhtml 内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>Hello #{name}</div>
</body>
</html>

3. EL表达式解析+PDF生成完整代码示例

下面是基于Jakarta EL 4.0 + Flying Saucer的可运行代码:

import jakarta.el.ELProcessor;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.io.FileOutputStream;

public class PdfGenerator {
    // EL表达式解析方法
    public static String parseElTemplate(String templatePath, Map<String, Object> context) throws Exception {
        // 读取模板文件内容
        String templateContent = Files.readString(Paths.get(templatePath));
        ELProcessor elProcessor = new ELProcessor();
        // 注入上下文参数
        context.forEach(elProcessor::defineBean);
        // 适配#{格式的EL表达式,也可以直接配置EL处理器的前缀后缀原生支持#{}
        String processedContent = templateContent.replace("#{", "${");
        return elProcessor.eval(processedContent).toString();
    }

    public static void main(String[] args) throws Exception {
        // 构造上下文参数
        Map<String, Object> data = new HashMap<>();
        data.put("name", "World!");
        // 解析EL表达式得到处理后的XHTML
        String parsedXhtml = parseElTemplate("src/WebContent/test.xhtml", data);
        // 调用Flying Saucer生成PDF
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(parsedXhtml);
        renderer.layout();
        try (FileOutputStream fos = new FileOutputStream("output.pdf")) {
            renderer.createPDF(fos);
        }
    }
}

注意事项

  • 解析完成后的XHTML必须是合规的XML格式,否则Flying Saucer会解析报错,参数传入时如果有特殊字符建议先做XML转义处理
  • 如果模板中本身存在#{字符需要保留,可自定义EL表达式的分隔符,避免误解析
  • 生产环境建议优先使用成熟模板引擎完成渲染,比手写EL解析逻辑的兼容性、稳定性更高

内容的提问来源于stack exchange,提问作者Marco Sulla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:12:03