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

      

generate pie chart graph in java pdf itext jfreechartiText 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;
	}
}

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();
	}

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.

java-bar-chart-pdf
java-pdf-pie-chart

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.


Facebook  Twitter      Stumbleupon  Delicious
  

5 Comments on “Generate Pie Chart/Bar Graph in PDF using iText & JFreeChart”

  • suresh wrote on 1 March, 2010, 15:04

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

  • pravin Tarte wrote on 30 June, 2010, 12:06

    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.

  • Swapna wrote on 6 August, 2010, 10:56

    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

  • Swapna wrote on 6 August, 2010, 11:09

    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.

  • Venkata wrote on 13 August, 2010, 1:19

    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();

Write a Comment

Gravatars are small images that can show your personality. You can get your gravatar for free today!

Copyright © 2010 ViralPatel.net. All rights reserved.