Я работаю над микросервисом Java PDF Generation с использованием весенней загрузки.Генерация PDF предназначена для двухэтапного процесса.
Шаблонирование - HTML-шаблон с неким языком выражений, который непосредственно читает структуру json
HTML в PDF - это генерирует pdf из html, созданного на шаге 1
Примечание: у меня есть несколько решений Java и JavaScript ( nunjucks / nodejs )для шагов 1 и 2, но мне действительно нужен более понятный подход, как изложено ниже.
- Моя конечная точка отдыха будет принимать 2 параметра: html-шаблон и json
- Структура json отображается наHTML-шаблон один к одному, и оба файла были предопределены для строгого контракта.
- Конечная точка службы не должна выполнять какое-либо сопоставление объектов данных JSON с HTML-элементами Dom, например таблицами, строками и т. д.
- Конечная точка только внедряет данные json в html, используя логику в коде java
- html исполняется / обрабатывается и читает json напрямую, используя некоторый язык выражений, посколькусодержит структуру json
- Затем конечная точка отвечает HTML-файлом с динамическими данными, которые можно отправить конечной точке веб-службы генератора PDF
Ниже приведен пример кода:
@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.ie без создания 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();
}
Заранее спасибо.
ПРИМЕЧАНИЕ: фрагменты кода, псевдокод, ссылки приветствуются.