Generate a PDF Containing Variable Data in Java

Information

PSPDFKit Processor has been deprecated and replaced by PSPDFKit Document Engine. All PSPDFKit Processor licenses will work as before and be supported until 15 May 2024 (we will contact you about license migration). To start using Document Engine, refer to the migration guide. With Document Engine, you’ll have access to robust new capabilities (read the blog for more information).

When generating a PDF, it may not be possible to foresee all of its contents ahead of time. For that reason, we advise using a templating language such as Mustache.

Templating languages allow for the injection of data at runtime. In regard to the PDF Generation feature, this means it gives you the possibility to customize HTML before sending it along for generation. Injecting data can be useful in situations such as name and date replacement, or when generating dynamic lists in invoices.

In this guide, you’ll take the letter example from the [Creating a PDF from Scratch][creating-a-pdf] guide and implement date and name replacement with the use of Mustache in Java. (Note {{name}} and {{date}} in the following HTML):

<!DOCTYPE html>
<head>
  ...
</head>
<html>
  <body>
    <div class="address">
      John Smith<br/>
      123 Smith Street<br/>
      90568 TA<br/>
      <br/>
      {{date}}
    </div>
    <div class="subject">Subject: PDF Generation FTW!</div>
    <div>
      <p>
        ...
      </p>
    </div>
    <div>{{name}}<br/></div>
  </body>
</html>

Next, you need to replace your template data with something real. Define the data to replace the template arguments in code, though in practice, this data may come from an external source or database.

To perform the replacement, you’ll use the Mustache.java package, which is an implementation of the Mustache templating system.

The following will stream the page.mustache file from the resources (the HTML seen above) into Mustache to replace {{name}} and {{date}}, and the result will be written to stringWriter:

HashMap<String, Object> scopes = new HashMap<>();
scopes.put("name", "John Smith Jr.");
scopes.put("date", "29 February, 2020");

InputStream is = Main.class.getClassLoader().getResourceAsStream("assets/page.mustache");
InputStreamReader mustacheFile = new InputStreamReader(is);

StringWriter stringWriter = new StringWriter();
MustacheFactory mf = new DefaultMustacheFactory();
Mustache mustache = mf.compile(mustacheFile, "example");
mustache.execute(stringWriter, scopes);

This example shows how you can use Mustache.java in Java, although it’s worth noting that there are many other templating language alternatives that may better suit your environment.