Struts 2 PDF Download
There are many ways you can generate PDF report in java. Here you will see easiest way to generate PDF report. To create PDF we have used itextpdf API for java and attached generated report in response to the user so that he can view/download PDF file locally.
Please see previous tutorial to create report in below format:
- Create maven project name: Struts2PDFDownload below is final project structure:
- pom.xml:
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.javahonk</groupId> <artifactId>Struts2PDFDownload</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>Struts2PDFDownload Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.16.3</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.3.16.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.0.6</version> </dependency> </dependencies> <build> <finalName>Struts2PDFDownload</finalName> </build> </project>
- ApplicationResources_en.properties:
label.welcome = Struts 2 PDF Download Example
- CreatePDFStruts2.java:
package com.javahonk.action; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; public class CreatePDFStruts2 { private static Font TIME_ROMAN = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD); private static Font TIME_ROMAN_SMALL = new Font( Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD); /** * @param args */ public static Document createPDF(String file) { Document document = null; try { document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(file)); document.open(); addMetaData(document); addTitlePage(document); createTable(document); document.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } return document; } private static void addMetaData(Document document) { document.addTitle("Generate PDF report"); document.addSubject("Generate PDF report"); document.addAuthor("Java Honk"); document.addCreator("Java Honk"); } private static void addTitlePage(Document document) throws DocumentException { Paragraph preface = new Paragraph(); creteEmptyLine(preface, 1); preface.add(new Paragraph("PDF Report", TIME_ROMAN)); creteEmptyLine(preface, 1); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy"); preface.add(new Paragraph("Report created on " + simpleDateFormat.format(new Date()), TIME_ROMAN_SMALL)); document.add(preface); } private static void creteEmptyLine(Paragraph paragraph, int number) { for (int i = 0; i < number; i++) { paragraph.add(new Paragraph(" ")); } } private static void createTable(Document document) throws DocumentException { Paragraph paragraph = new Paragraph(); creteEmptyLine(paragraph, 2); document.add(paragraph); PdfPTable table = new PdfPTable(3); PdfPCell c1 = new PdfPCell(new Phrase("First Name")); c1.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(c1); c1 = new PdfPCell(new Phrase("Last Name")); c1.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(c1); c1 = new PdfPCell(new Phrase("Test")); c1.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(c1); table.setHeaderRows(1); for (int i = 0; i < 5; i++) { table.setWidthPercentage(100); table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE); table.addCell("Java"); table.addCell("Honk"); table.addCell("Success"); } document.add(table); } }
- Struts2PDFDownloadAction.java:
package com.javahonk.action; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; public class Struts2PDFDownloadAction{ @Action(value = "/downloadPDFFileAction") public void downloadCSVFileAction() throws Exception { final ServletContext servletContext = ServletActionContext.getServletContext(); final File tempDirectory = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); final String temperotyFilePath = tempDirectory.getAbsolutePath(); String fileName = "JavaHonkStruts2.pdf"; HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/pdf"); response.setHeader("Content-disposition", "attachment; filename="+ fileName); try { CreatePDFStruts2.createPDF(temperotyFilePath+"\\"+fileName); ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos = convertPDFToByteArrayOutputStream(temperotyFilePath+"\\"+fileName); OutputStream os = response.getOutputStream(); baos.writeTo(os); os.flush(); } catch (Exception e1) { e1.printStackTrace(); } } private ByteArrayOutputStream convertPDFToByteArrayOutputStream(String fileName) { InputStream inputStream = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { inputStream = new FileInputStream(fileName); byte[] buffer = new byte[1024]; baos = new ByteArrayOutputStream(); int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, bytesRead); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return baos; } }
- index.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Struts 2 PDF Download Example</title> <s:head /> </head> <body> <h2 style="color: green"> <s:text name="label.welcome" /> </h2> <s:form method="post" action="downloadPDFFileAction"> <s:submit value="Download PDF" /> </s:form> </body> </html>
- You could run this project on any server. Below will be output:
- Fork your own copy of project from GitHub
Download Project: Struts2PDFDownload