I am using Thymeleaf version 3.1.2.RELEASE
and flying-saucer-pdf version 9.3.1
to generate PDF from a JavaFX application. I have the following template.html
:
<html xmlns:th="http://www.thymeleaf.org" lang="ar" dir="rtl">
<body>
<h3 style="text-align: center; color: black">
<span th:text="${title}"></span>
</h3>
</body>
</html>
Method to parse Thymeleaf template:
private String parseThymeleafTemplate() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
Context context = new Context();
context.setVariable("title", "عنوان");
return templateEngine.process("template", context);
}
Method to generate PDF from HTML:
public void onPrintPdfButtonClick() throws DocumentException, IOException {
String outputFolder = ".../template.pdf";
OutputStream outputStream = new FileOutputStream(outputFolder);
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver resolver = renderer.getFontResolver();
resolver.addFont("src/main/resources/Al Nile.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.setDocumentFromString(parseThymeleafTemplate());
renderer.layout();
renderer.createPDF(outputStream);
outputStream.close();
}
For some reason, the generated PDF file has no content at all! I have set all the file encodings to UTF-8. I am also adding Arabic font to resolver. Nothing works so far. Anyone faced this issued before? I am really interested in understanding the issue, so we can solve it together.
Using PdfRendererBuilder
with Thymeleaf was actually more functional to solve this issue rather than ITextRenderer
.
var pdfRendererBuilder = new PdfRendererBuilder();
pdfRendererBuilder.useFont({INJECT_FONT_HERE}).withHtml().toStream().run();
font style arial-unicode-ms.ttf
worked for Arabic text.
Add in your html file the following style:
<style>
* {
font-family: "Arial Unicode MS", serif;
}
</style>