Search code examples
javautf-8itextthymeleafarabic-support

Thymeleaf PDF with Arabic text shows blank


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.


Solution

  • 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>