我正在使用Spring Boot开发Java PDF Generation微服务。 pdf的生成应分为两个阶段。
模板化-具有某种表达语言的html模板,可直接读取json结构
HTML到PDF-这将从步骤1中生成的html生成pdf
注意:对于第1步和第2步,我有一些Java和JavaScript( nunjucks / nodejs )解决方案,但是我确实需要一种更易于维护的方法,如下所示。
下面是示例代码:
@POST
@Path("createPdf")
public Response createPdf(String htmlTemplateParam, String json) {
//Read template from endpoint param or start off with reading local html template from resource folder
String templateHtml = IOUtils.toString(getClass().getResourceAsStream(HTMLTemplateFiles.INCOMING_TEMPLATE));
RequestJson requestJson = [Prepare json before passing to HTML Template]];
if(requestJson.isContentValid()) {
LOG.info("incoming data successfully validated");
// TODO
// Pass the requestJson (Endpoint Param JSON ) to templateHtml
// Trigger the reading of the Json data and populating different HTML DOM elements using some sort of expression predifined in HTML
// Get hold of the rendered HTML
String resolvedHtml = [HTML with data from json param into endpoint];
// The next bit is done
String pdf = htmlToPdfaHandler.generatePdfFromHtml(resolvedHtml);
javax.ws.rs.core.Response response = Response.ok().entity(Base64.decodeBase64(pdf)).build();
}
}
模板化阶段是我需要帮助的地方。
请问,为此的最佳技术解决方案是什么?
我对Java和JavaScript框架感到满意,并乐于学习您建议的任何框架。
但是,我的主要设计目标是确保随着我们拥有新模板以及模板和数据的更改,非技术人员可以更改html / json并生成pdf。
此外,模板和数据更改均不需要更改Java代码。
脑海里有一些东西,例如jsonpath,百里香叶,JavaScript等。但是,我喜欢最佳实践,喜欢向具有类似用例的真实经验的人学习。
经过进一步的研究和第一个答案,我也在考虑下面的freemarker解决方案。
但是,我如何通过读取输入json.i.来自动创建一个免费的标记模板数据?无需创建POJO / DTO
基于第一个答案:
Configuration cfg = new Configuration(new Version("2.3.23"));
cfg.setDefaultEncoding("UTF-8");
// Loading you HTML template (via file or input stream):
Template template = cfg.getTemplate("template.html");
// Will this suffice for all JSON Structure, including nested deep ones
Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, String[]> templateData = new Gson().fromJson(json, mapType);
try (StringWriter out = new StringWriter()) {
// In output stream the result will be template with values from map:
template.process(templateData, out);
System.out.println(out.getBuffer().toString());
out.flush();
}
谢谢。
注意:欢迎使用代码段,伪代码和参考。
答案 0 :(得分:0)
其中一个选项可能是FreeMarker的用法:
Configuration cfg = new Configuration(new Version("2.3.23"));
cfg.setDefaultEncoding("UTF-8");
// Loading you HTML template (via file or input stream):
Template template = cfg.getTemplate("template.html");
// You need convert json to map of parameters (key-value):
Map<String, Object> templateData = new HashMap<>();
templateData.put("msg", "Today is a beautiful day");
try (StringWriter out = new StringWriter()) {
// In output stream the result will be template with values from map:
template.process(templateData, out);
System.out.println(out.getBuffer().toString());
out.flush();
}