Generate Pie Chart/Bar Graph in PDF using iText & JFreeChart

iText is a wonderful library if you want to generate PDFs in Java. It comes with a huge set of API to create/manage a PDF file. We already saw in our previous tutorial how to generate a pdf file in itext and also how to merge two pdf files using itext. In this tutorial we will see how to generate Pie charts and Bar charts in Java using iText and jFreeChart library. First a brief note about jFreeChart. JFreeChart is a free 100% Java chart library that makes it easy for developers to display professional quality charts in their applications. It gives a wide range of API to generate charts and graphs in Java.

Step 1: Download required Jar files

For this example we will need following jar files.
  • iText-2.1.5.jar (download)
  • jcommon-1.0.16.jar
  • jfreechart-1.0.13.jar
Download the jFreeChart jars from: http://sourceforge.net/projects/jfreechart/files/

Step 2: Generating Pie Charts/Bar Graph using jFreeChart

Next we will use jFreeChart library and generate the pie and bar charts.
package net.viralpatel.itext.pdf; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DefaultPieDataset; public class PieChartDemo { public static void main(String[] args) { //TODO: Add code to generate PDFs with charts } public static JFreeChart generatePieChart() { DefaultPieDataset dataSet = new DefaultPieDataset(); dataSet.setValue("China", 19.64); dataSet.setValue("India", 17.3); dataSet.setValue("United States", 4.54); dataSet.setValue("Indonesia", 3.4); dataSet.setValue("Brazil", 2.83); dataSet.setValue("Pakistan", 2.48); dataSet.setValue("Bangladesh", 2.38); JFreeChart chart = ChartFactory.createPieChart( "World Population by countries", dataSet, true, true, false); return chart; } public static JFreeChart generateBarChart() { DefaultCategoryDataset dataSet = new DefaultCategoryDataset(); dataSet.setValue(791, "Population", "1750 AD"); dataSet.setValue(978, "Population", "1800 AD"); dataSet.setValue(1262, "Population", "1850 AD"); dataSet.setValue(1650, "Population", "1900 AD"); dataSet.setValue(2519, "Population", "1950 AD"); dataSet.setValue(6070, "Population", "2000 AD"); JFreeChart chart = ChartFactory.createBarChart( "World Population growth", "Year", "Population in millions", dataSet, PlotOrientation.VERTICAL, false, true, false); return chart; } }
Code language: Java (java)
In above code, we have created two methods that returns JFreeChart object. These methods creates charts using jFreeChart API. Note that we have used dummy data. In real example these values must be dynamically fetched from database or other data source. Also note that the main method is still empty. We haven’t added yet the code to generate actual PDF file using iText API.

Step 3: Generate PDF with Charts/Graphs in Java using iText

Now its time to generate the actual PDF files. For this we will use iText library and pass it the graphs generated by jFreeChart library. Add following code in your java class.
public static void main(String[] args) { writeChartToPDF(generateBarChart(), 500, 400, "C://barchart.pdf"); writeChartToPDF(generatePieChart(), 500, 400, "C://piechart.pdf"); } public static void writeChartToPDF(JFreeChart chart, int width, int height, String fileName) { PdfWriter writer = null; Document document = new Document(); try { writer = PdfWriter.getInstance(document, new FileOutputStream( fileName)); document.open(); PdfContentByte contentByte = writer.getDirectContent(); PdfTemplate template = contentByte.createTemplate(width, height); Graphics2D graphics2d = template.createGraphics(width, height, new DefaultFontMapper()); Rectangle2D rectangle2d = new Rectangle2D.Double(0, 0, width, height); chart.draw(graphics2d, rectangle2d); graphics2d.dispose(); contentByte.addTemplate(template, 0, 0); } catch (Exception e) { e.printStackTrace(); } document.close(); }
Code language: Java (java)
In above code we have created a method writeChartToPDF() which take few arguments like jFreeChart object, width, height and filename and write a PDF files in that file. This is ofcourse very preliminary example of adding pie charts in PDF using Java iText/jFreeChart. But atleast it gives basic idea of how to achieve this. Feel free to modify the above code and play around to generate different charts/graphs in PDF.

View Comments

  • Excellent Tutorial. It's Matches with my requirement. Very Very Thanks for Providing This tutorial

  • can u provide me a code to handle multiple edit button for each row of table .

    i am using dispatch action of struts 1 , but not been able to set the hidden varibale dynamically to send it to next action.

  • Hi Viral,

    A very useful article! Thanks a bunch. :-)

    I am facing a technical problem and I wonder if you will be able to help me out. I am using iText 2.1.5 (I know a newer version exists) to generate pdf files. I am picking up text from database and putting it in the pdf file. The database text however has tags like "Bold" instead of good old "<b>Bold</b>".

    Despite using HTMLWorker.parseToList, the text Bold" is printed as it is in the generated pdf. I see that tags are not in the tagsSupported list of HTMLWorker.

    I have googled and checked many sites but nothing seems to be working so far. If I don't find any solution, I will have to resort to parsing the strings by myself and replacing tags with appropriate html tags like <b>, etc. I am hoping I don't have to do that as it somehow feels inelegant.

    Am I doing something wrong? Can you please help me out here?
    Thanks a lot once again!
    Swapna

  • I am sorry Viral. I didn't realize the site will format my text as per the html tags I mentioned. I will post the relevant part once again.

    The database text has tags like "span" with "style" set to "font-weight:bold;" or "font-style:italic" instead of using b, u or i like tags.

  • Hi Viral,

    I am using iText and JFreeChart.
    I have generated a chart and am using iText to save the chart as PDF.
    When I save the PDF to filesystem, the file saves correctly, then when opened, shows chart without any problems.

    But when I try to serve the pdf as response to request, it gives me error file does not start with %pdf-.

    My code is below.

    Can you help me out in resolving this problem, where I might have made any mistake?

    Thanks.

    Regards,
    Venkata.

    Appreciate your help.


    response.setContentType("application/pdf");
    Rectangle pagesize = new Rectangle(width, height);
    Document document = new Document(pagesize, 50, 50, 50, 50);

    try {
    PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
    document.addTitle("Test PDF");
    document.addAuthor("research");
    document.addSubject("Demo");
    document.open();

    PdfContentByte cb = writer.getDirectContent();
    PdfTemplate tp = cb.createTemplate(width, height);
    Graphics2D g2 = tp.createGraphics(width, height, mapper);
    Rectangle2D r2D = new Rectangle2D.Double(0, 0, width, height);
    chart.draw(g2, r2D);
    g2.dispose();
    cb.addTemplate(tp, 0, 0);

    } catch (DocumentException de) {
    System.err.println(de.getMessage());
    }
    document.close();

  • Thanks a lot for the tutorial. A small addition, you could replace the document line by the following to set the pdf size :

    Document document = new Document(new Rectangle(width,height));

  • can anyone help me for creating dynamic graph(live trading)
    x axis shoul be current time and y axis value is to get from database........
    I have done x axis part in that i used thread and timeseries now i want to connect with database on y axis............
    plzzzzzzzz help
    Thank u :)

  • good work.
    Its really suited my requirement.....with partial changes like, instead using pdf html display and getting data from db to replace the hardcoded dataset values

Share
Published by
Viral Patel
Tags: iText Java jFreeChart pdf PDF in Java

Recent Posts

  • Java

Java URL Encoder/Decoder Example

Java URL Encoder/Decoder Example - In this tutorial we will see how to URL encode/decode…

4 years ago
  • General

How to Show Multiple Examples in OpenAPI Spec

Show Multiple Examples in OpenAPI - OpenAPI (aka Swagger) Specifications has become a defecto standard…

4 years ago
  • General

How to Run Local WordPress using Docker

Local WordPress using Docker - Running a local WordPress development environment is crucial for testing…

4 years ago
  • Java

Create and Validate JWT Token in Java using JJWT

1. JWT Token Overview JSON Web Token (JWT) is an open standard defines a compact…

4 years ago
  • Spring Boot

Spring Boot GraphQL Subscription Realtime API

GraphQL Subscription provides a great way of building real-time API. In this tutorial we will…

4 years ago
  • Spring Boot

Spring Boot DynamoDB Integration Test using Testcontainers

1. Overview Spring Boot Webflux DynamoDB Integration tests - In this tutorial we will see…

4 years ago