Spring Boot PDF iText integration with String Template

PROGRAMMINGJava ExamplesC Examples
Java Examples
C Examples
C Tutorials
aws
JAVAEXCEPTIONSCOLLECTIONSSWINGJDBC
EXCEPTIONS
COLLECTIONS
SWING
JDBC
JAVA 8
SPRING
SPRING BOOT
HIBERNATE
PYTHON
PHP
JQUERY
PROGRAMMINGJava ExamplesC Examples
Java Examples
C Examples
C Tutorials
aws
In this tutorials, we will see how to work with Spring Boot PDF with iText using String Template.
Technologies:


SpringBoot 1.4.5.RELEASE
iTextpdf 5.2.0


SpringBoot 1.4.5.RELEASE
iTextpdf 5.2.0
String Template 3.2
iText Pdf tool xmlworker 1.1
HTML cleaner 2.2
Java 8
Project Structure:
pom.xml
Included iText pdf, StringTemplate, htmlcleaner and recommended dependencies.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.onlinetutorialspoint</groupId>
  <artifactId>SpringBoot-iText-Pdf-Example</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringBoot-iText-Pdf-Example</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.5.RELEASE</version>
  </parent>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>${jstl.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.antlr</groupId>
      <artifactId>stringtemplate</artifactId>
      <version>3.2</version>
    </dependency>
    <dependency>
      <groupId>com.itextpdf.tool</groupId>
      <artifactId>xmlworker</artifactId>
      <version>1.1.0</version>
    </dependency>
    <dependency>
      <groupId>net.sourceforge.htmlcleaner</groupId>
      <artifactId>htmlcleaner</artifactId>
      <version>2.2</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

Data.java
It is used to provide dynamic data to String template.
package com.onlinetutorialspoint.beans;

public class Data {
  private String empNumber;
  private String empName;
  private String joiningDate;
  private String salary;
  private String deptNo;
  private String managerId;
  public Data(String empNumber, String empName,String joiningDate, String salary, String deptNo, String managerId) {
    super();
    this.empNumber = empNumber;
    this.empName = empName;
    this.joiningDate = joiningDate;
    this.salary = salary;
    this.deptNo = deptNo;
    this.managerId = managerId;
  }
  public String getEmpNumber() {
    return empNumber;
  }
  public void setEmpNumber(String empNumber) {
    this.empNumber = empNumber;
  }
  
  public String getEmpName() {
    return empName;
  }
  public void setEmpName(String empName) {
    this.empName = empName;
  }
  public String getJoiningDate() {
    return joiningDate;
  }
  public void setJoiningDate(String joiningDate) {
    this.joiningDate = joiningDate;
  }
  public String getSalary() {
    return salary;
  }
  public void setSalary(String salary) {
    this.salary = salary;
  }
  public String getDeptNo() {
    return deptNo;
  }
  public void setDeptNo(String deptNo) {
    this.deptNo = deptNo;
  }
  public String getManagerId() {
    return managerId;
  }
  public void setManagerId(String managerId) {
    this.managerId = managerId;
  }
}

Exports.java
Export Controller is used to handling actual pdf export logic. Where we create Data object and passed dynamic data to the StringTemplate object.
package com.onlinetutorialspoint.controller;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import com.onlinetutorialspoint.beans.Data;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;

@Controller
public class Exports {

  @RequestMapping(value = "generatePDF.htm", method = RequestMethod.GET)
  public void exportToPDF(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
    OutputStream os = null;
    try {
      
      Data data = new Data("8596582","CHANDRA SHEKHAR","03/30/2016","$2,000.00","1005205",
          "452562");

      StringTemplate page = getStringTemplate();
      page.setAttribute("data",data);
      
      String content = page.toString();

      final HtmlCleaner htmlCleaner = new HtmlCleaner();
      final TagNode tagNode = htmlCleaner.clean(content);
      content = htmlCleaner.getInnerHtml(tagNode);

      os = response.getOutputStream();

      Document document = null;

      document = new Document(PageSize.A4);

      final ByteArrayOutputStream baos = new ByteArrayOutputStream();
      final PdfWriter writer = PdfWriter.getInstance(document, baos);
      document.open();

      final HtmlPipelineContext htmlContext = new HtmlPipelineContext();

      htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

      final CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
      final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext,
          new PdfWriterPipeline(document, writer)));
      final XMLWorker worker = new XMLWorker(pipeline, true);
      final XMLParser parser = new XMLParser(worker);

      try {
        parser.parse(new StringReader(content));
      } catch (final Exception e) {
        e.printStackTrace();
        
      }

      document.close();
      response.setContentType("Content-Type: text/html; charset=UTF-8");
      response.addHeader(
          "Content-Disposition",
          "attachment; filename=employee_details.pdf");
      response.setContentLength(baos.size());
      baos.writeTo(os);
    } catch (final IOException | DocumentException e) {
      e.printStackTrace();
    } finally {
      try {
        if (os != null) {
          os.flush();
          os.close();
        }
      } catch (final IOException e) {
        e.printStackTrace();
      }
    }
  }

  StringTemplate getStringTemplate() {
    final StringTemplateGroup group = new StringTemplateGroup("Generators");
    return group.getInstanceOf("employee_details");
  }
}

HomeController.java
package com.onlinetutorialspoint.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

    @RequestMapping(value = "index", method = RequestMethod.GET)
    public String init(Model model) {
        return "index.jsp";
    }
}

Creating StringTemplate.
employee_details.st
<html>
<body leftmargin='10.0' rightmargin='10.0' topmargin='10.0' bottommargin='10.0' style='font-family: Arial; font-size: 14.0pt; '>
    <div>
          <table style='font-size:8.0pt; font-family:Arial;  border: 0.5px thick #000000; border-collapse: collapse; width: 1500pt;'>
        <tr>
          <td colspan='2' style='text-align:left; padding: .1pt .1pt .1pt .1pt;'>
             <p style='color: green;line-height: 12.0pt' >
              
             </p>	
          </td>
          <td colspan='4' style='text-align:left; padding: .1pt .1pt .1pt .1pt;'>
             <p style='color: black;line-height: 12.0pt' >
              <b><span style='font-size:16.0pt;font-family:Arial;color:00a8ff'>EMPLOYEE DETAILS</span></b>
             </p>	
          </td>
        </tr>
        <tr>
        <td colspan='6' style='text-align:left; background-color:00b894;'>
             <br/>
          </td>
        </tr>
      </table>
      <div>
          </div>
          <div leftmargin='36.0' rightmargin='36.0' topmargin='36.0' bottommargin='36.0'>
          <table style='font-size:8.0pt; font-family:Arial; border-collapse: collapse; width: 900pt;'>
        <tr>
          <td style='text-align:left; width:50%;padding: .1pt .1pt .1pt .1pt;'>
             <p style='line-height: 12.0pt' >
              <b><span style='font-size:10.0pt;font-family:Arial;'>Employee Number</span></b>
             </p>	
          </td>
          <td style='text-align:left; width:50%;padding: .1pt .1pt .1pt .1pt;'>
             <p style='line-height: 12.0pt' >
              <b><span style='font-size:10.0pt;font-family:Arial;'>Joining Date</span></b>
             </p>	
          </td>
        </tr>
        <tr>
          <td style='text-align:left; width:50%; padding: .1pt .1pt .1pt .1pt;'>
             <p style='line-height: 12.0pt' >
              <b><span style='font-size:10.0pt;font-family:Arial;'>$data.empNumber$</span></b>
             </p>	
          </td>
          <td style='text-align:left; width:50%; padding: .1pt .1pt .1pt .1pt;'>
             <p style='line-height: 12.0pt' >
              <b><span style='font-size:10.0pt;font-family:Arial;'>$data.joiningDate$</span></b>
             </p>	
          </td>
        </tr>
        <tr>
          <td colspan=2 style='width:100%;'>
             <p style='line-height: 12.0pt' >
             </p>	
          </td>
        </tr>			
      </table>
      <div>

          </div>
          
      <table style='font-size:8.0pt; font-family:Arial;  border: 0.5px thick #000000; border-collapse: collapse; width: 900pt;'>
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
              <b><span style='font-size:10.0pt;font-family:Arial;'>EMPLOYEE NAME</span></b>
          </td>
        </tr>	
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
              <b><span style='font-size:10.0pt;font-family:Arial;'>$data.empName$</span></b>
          </td>
        </tr>			
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
              <span style='font-size:10.0pt;font-family:Arial;'>DEPARTMENT NUMBER</span>
          </td>
        </tr>	
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
              <span style='font-size:10.0pt;font-family:Arial;'>$data.deptNo$</span>
          </td>
        </tr>
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
          </td>
        </tr>
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
              <span style='font-size:10.0pt;font-family:Arial;'>SALARY</span>
          </td>
        </tr>	
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
              <span style='font-size:10.0pt;font-family:Arial;'>$data.salary$ </span>
          </td>
        </tr>	
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 100%'>
          </td>
        </tr>
        <tr>
          <td style='padding: .1pt .1pt .1pt .1pt; width : 50%'>
              <span style='font-size:10.0pt;font-family:Arial;'></span>
          </td>
          <td style='padding: .1pt .1pt .1pt .1pt; width : 50%'>
              <span style='font-size:10.0pt;font-family:Arial;'>MANAGER ID</span>
          </td>
        </tr>				
        <tr>
          <td style='padding: .1pt .1pt .1pt .1pt; width : 50%'>
              <span style='font-size:10.0pt;font-family:Arial;'></span>
          </td>
          <td style='padding: .1pt .1pt .1pt .1pt; width : 50%'>
              <span style='font-size:10.0pt;font-family:Arial;'>$data.managerId$</span>
          </td>
        </tr>
        <tr>
          <td colspan='2' style='padding: .1pt .1pt .1pt .1pt; width : 16%'>
          </td>
        </tr>
  
      </table>
      <div><br/></div>
      </div>
</div>
</body>
</html>		

Spring Boot Application.java
package com.onlinetutorialspoint;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

Run Application:
mvn clean install
mvn spring-boot:run
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ SpringBoot-iText-Pdf-Example ---
[INFO] No sources to compile
[INFO] 
[INFO] <<< spring-boot-maven-plugin:1.4.5.RELEASE:run (default-cli) < test-compile @ SpringBoot-iText-Pdf-Example <<<
[INFO] 
[INFO] --- spring-boot-maven-plugin:1.4.5.RELEASE:run (default-cli) @ SpringBoot-iText-Pdf-Example ---

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.4.5.RELEASE)

2018-05-20 18:40:47.665  INFO 5616 --- [           main] com.onlinetutorialspoint.Application     : Starting Application on DESKTOP-RN4SMHT with PID 5616 (E:\work\SpringBoot-iText-Pdf-Example\target\classes started by Lenovo in E:\work\SpringBoot-iText-Pdf-Example)
2018-05-20 18:40:47.665  INFO 5616 --- [           main] com.onlinetutorialspoint.Application     : No active profile set, falling back to default profiles: default
2018-05-20 18:40:47.790  INFO 5616 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68db8c58: startup date [Sun May 20 18:40:47 IST 2018]; root of context hierarchy
2018-05-20 18:40:50.684  INFO 5616 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-05-20 18:40:50.705  INFO 5616 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2018-05-20 18:40:50.705  INFO 5616 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.11
....
....
Output:
Access application using :  http://localhost:8080/index
Click on Download button, then the pdf will download into your local system.
Happy Learning 🙂

Top 7 Interview Questions in Hibernate
4 ways to create an Object in Java
Spring Boot H2 Database + JDBC Template Example
Spring Boot Actuator Database Health Check
How to set Spring Boot SetTimeZone
Java Heap and Garbage Collection
Spring Boot Validation Login Form Example
Spring Boot MVC Example Tutorials
Spring Boot JPA Integration Example
Spring Boot Hibernate Integration Example
How to set Spring boot favicon image
Spring Boot Security MySQL Database Integration Example
Spring Boot Apache ActiveMq In Memory Example
Spring Boot MongoDB + Spring Data Example
How to change Spring Boot Tomcat Port Number

Top 7 Interview Questions in Hibernate
4 ways to create an Object in Java
Spring Boot H2 Database + JDBC Template Example
Spring Boot Actuator Database Health Check
How to set Spring Boot SetTimeZone
Java Heap and Garbage Collection
Spring Boot Validation Login Form Example
Spring Boot MVC Example Tutorials
Spring Boot JPA Integration Example
Spring Boot Hibernate Integration Example
How to set Spring boot favicon image
Spring Boot Security MySQL Database Integration Example
Spring Boot Apache ActiveMq In Memory Example
Spring Boot MongoDB + Spring Data Example
How to change Spring Boot Tomcat Port Number






ALOK GUPTA
January 22, 2019 at 7:38 pm - Reply 

Thanks for the tutorial. I want to add external CSS in the html. Could you please suggest for the same. Internal css is working for me.









Jeewan Kale
September 3, 2020 at 12:40 am - Reply 

how to add image in the pdf using string template










ALOK GUPTA
January 22, 2019 at 7:38 pm - Reply 

Thanks for the tutorial. I want to add external CSS in the html. Could you please suggest for the same. Internal css is working for me.




Thanks for the tutorial. I want to add external CSS in the html. Could you please suggest for the same. Internal css is working for me.





Jeewan Kale
September 3, 2020 at 12:40 am - Reply 

how to add image in the pdf using string template




how to add image in the pdf using string template
 


Δ
 Spring Boot – Hello World
 Spring Boot – MVC Example
 Spring Boot- Change Context Path
 Spring Boot – Change Tomcat Port Number
 Spring Boot – Change Tomcat to Jetty Server
 Spring Boot – Tomcat session timeout
 Spring Boot – Enable Random Port
 Spring Boot – Properties File
 Spring Boot – Beans Lazy Loading
 Spring Boot – Set Favicon image
 Spring Boot – Set Custom Banner
 Spring Boot – Set Application TimeZone
 Spring Boot – Send Mail
 Spring Boot – FileUpload Ajax
 Spring Boot – Actuator
 Spring Boot – Actuator Database Health Check
 Spring Boot – Swagger
 Spring Boot – Enable CORS
 Spring Boot – External Apache ActiveMQ Setup
 Spring Boot – Inmemory Apache ActiveMq
 Spring Boot – Scheduler Job
 Spring Boot – Exception Handling
 Spring Boot – Hibernate CRUD
 Spring Boot – JPA Integration CRUD
 Spring Boot – JPA DataRest CRUD
 Spring Boot – JdbcTemplate CRUD
 Spring Boot – Multiple Data Sources Config
 Spring Boot – JNDI Configuration
 Spring Boot – H2 Database CRUD
 Spring Boot – MongoDB CRUD
 Spring Boot – Redis Data CRUD
 Spring Boot – MVC Login Form Validation
 Spring Boot – Custom Error Pages
 Spring Boot – iText PDF
 Spring Boot – Enable SSL (HTTPs)
 Spring Boot – Basic Authentication
 Spring Boot – In Memory Basic Authentication
 Spring Boot – Security MySQL Database Integration
 Spring Boot – Redis Cache – Redis Server
 Spring Boot – Hazelcast Cache
 Spring Boot – EhCache
 Spring Boot – Kafka Producer
 Spring Boot – Kafka Consumer
 Spring Boot – Kafka JSON Message to Kafka Topic
 Spring Boot – RabbitMQ Publisher
 Spring Boot – RabbitMQ Consumer
 Spring Boot – SOAP Consumer
 Spring Boot – Soap WebServices
 Spring Boot – Batch Csv to Database
 Spring Boot – Eureka Server
 Spring Boot – MockMvc JUnit
 Spring Boot – Docker Deployment