能否将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
相关产品推荐
相关产品推荐

