Spring Boot Download PDF Example (2024)
In this tutorial, we'll demonstrate how to generate PDF and export data from the database using JPA in Spring Boot with itext7 library.
Q: What is itext7?
Ans:
iText is an open-source Java and .Net library that allow users to create, convert, and modify PDF documents.
To utilized the iText7
library, we need to add below library in the project.
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.0.4</version>
<type>pom</type>
</dependency>
Create Spring Boot application
Create Spring Boot application from Spring Initializr.
Project Structure
Add Dependencies
Add com.itextpdf
dependency in pom.xml
.
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.techgeeknext</groupId>
<artifactId>spring-boot-export-pdf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-export-pdf</name>
<description>Spring Boot Export PDF Example</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext7-core -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.0.4</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Take a look at our suggested posts:
Application Properties
Add database connection details in application.properties
file.
spring.datasource.url=jdbc:mysql://localhost/employeetestdb?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.platform=mysql
spring.datasource.initialization-mode=always
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
# spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = create-drop
#spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always
Test Data for PDF Document
There must be some data in the database in order to generate documents and export data using JPA. We will now enter some test data in database. Hibernate generates the schema automatically; the data.sql file is then executed to populate the table with test data.
INSERT INTO employees(id, name, role) VALUES(1, 'User1', 'Admin');
INSERT INTO employees(id, name, role) VALUES(2, 'User2', 'Supervisor');
INSERT INTO employees(id, name, role) VALUES(3, 'User3', 'Tester');
INSERT INTO employees(id, name, role) VALUES(4, 'User4', 'HR');
INSERT INTO employees(id, name, role) VALUES(5, 'User5', 'Developer');
Data Model
Create Employee
class, contains id
, name
and
role
.
package com.techgeeknext.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "name")
private String name;
@Column(name = "role")
private String role;
}
JPA Repository
Create EmployeeRepository
interface that extends JpaRepository
.
package com.techgeeknext.repository;
import com.techgeeknext.model.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
Controller to generate the PDF document
Create the rest endpoint to generate the PDF document and to extract data from database using JPA repository.
package com.techgeeknext.controller;
import com.techgeeknext.repository.EmployeeRepository;
import com.techgeeknext.util.PDFGeneratorUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
public class EmployeeController {
@Autowired
EmployeeRepository employeeRepository;
@GetMapping(
value = "/pdf",
produces = MediaType.APPLICATION_PDF_VALUE
)
public void employeeDetailsReport(HttpServletResponse response) throws IOException {
DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD:HH:MM:SS");
String fileType = "attachment; filename=employee_details_" + dateFormat.format(new Date()) + ".pdf";
response.setHeader("Content-Disposition", fileType);
PDFGeneratorUtility.employeeDetailReport(response,employeeRepository.findAll());
}
}
PDF Generator Utility
We will create common utility class to write the data to PDF document.
package com.techgeeknext.util;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.TextAlignment;
import com.techgeeknext.model.Employee;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class PDFGeneratorUtility {
public static void employeeDetailReport(HttpServletResponse response, List<Employee> employees) throws IOException {
PdfWriter writer = new PdfWriter(response.getOutputStream());
PdfDocument pdfDocument;
pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument);
try {
document.add(new Paragraph("TechGeekNext Example").setBold().setPaddingLeft(200f));
Table table = new Table(new float[]{20f, 50f, 30F});
table.setWidthPercent(100)
.setPadding(0)
.setFontSize(9);
Cell cell1 = new Cell(1,3);
cell1.setTextAlignment(TextAlignment.CENTER);
cell1.add("Employee Details").setBold();
table.addCell(cell1);
table.addCell(new Cell().add("Id").setBold());
table.addCell(new Cell().add("Name").setBold());
table.addCell(new Cell().add("Role").setBold());
for(Employee emp:employees) {
table.addCell(new Cell().add(String.valueOf(emp.getId())));
table.addCell(new Cell().add(emp.getName()));
table.addCell(new Cell().add(emp.getRole()));
}
document.add(table);
document.close();
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Test Spring Boot to Generate and Export PDF
- Start the Spring Boot Application by running
spring-boot:run
or by running main class. Generate PDF
Use GET method with end point http://localhost:8080//pdf which will generate and download the PDF document.Download PDF
After using the above rest end point, the following PDF document with table will be generated.
Download Source Code
The full source code for this article can be found below.
- Download it here - Spring Boot Export Data To PDF Example