3

I would like to draw two graphs showing stacked bar graphs with labels, into a PDF file in Java. I would get the data from a Mongodb for input to graphs. How to do that?

peterh
  • 11,875
  • 18
  • 85
  • 108
Anthati Nagaraju
  • 321
  • 1
  • 6
  • 14

4 Answers4

3

Using JFreechart and pdfbox I have done something similar to what you are requesting for a report I made once. Making a pie chart was as follows:

public class PieChartExample {
    public static void main(String[] args) {
        // Create a simple pie chart
        DefaultPieDataset pieDataset = new DefaultPieDataset();
        pieDataset.setValue("Chrome", new Integer(42));
        pieDataset.setValue("Explorer", new Integer(24));
        pieDataset.setValue("Firefox", new Integer(24));
        pieDataset.setValue("Safari", new Integer(12));
        pieDataset.setValue("Opera", new Integer(8));
        JFreeChart chart = ChartFactory.createPieChart3D(
            "Browser Popularity", // Title
            pieDataset, // Dataset
            true, // Show legend
            true, // Use tooltips
            false // Configure chart to generate URLs?
        );
        try {
            ChartUtilities.saveChartAsJPEG(new File("C:\\Users\\myname\\Desktop\\chart.jpg"), chart, 500, 300);
        } catch (Exception e) {
            System.out.println("Problem occurred creating chart.");
        }
    }
}

The above example came from a pdf I think is available on their website, it has examples for other charts if you need them. Once saved, I could import it to the pdf similarly to this:

try {

    PDDocument document = new PDDocument();
    PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
    document.addPage(page); 

    InputStream in = new FileInputStream(new File("c:/users/myname/desktop/chart.jpg"));            
    PDJpeg img = new PDJpeg(document, in);
    PDPageContentStream contentStream = new PDPageContentStream(document, page);
    contentStream.drawImage(img, 10, 300);
    contentStream.close();

    document.save("pathway/to/save.pdf");
} catch (IOException e) {
    System.out.println(e);
} catch (COSVisitorException cos) {
    System.out.println(cos);
}

itext is also a good library for pdf manipulation, but that is commercial after a point whereas pdfbox should be open source.

Good Luck!

Levenal
  • 3,796
  • 3
  • 24
  • 29
2

You can use gnujavaplot. It's an api enabling you to call gnuplot via Java.

merours
  • 4,076
  • 7
  • 37
  • 69
2

You can take a look at JasperReports. It's a Java framework for generating reports in PDF and other file formats. It has integrated support for various types of charts using the JFreeChart library.

However, I should warn you that the learning curve for JasperReports is quite steep. Perhaps you could consider using a combination of JFreeChart with iText instead, as suggested in this post.

Community
  • 1
  • 1
Zoltán
  • 21,321
  • 14
  • 93
  • 134
2

you can use any charting library to generate the chart (somme libraries examples here), and then add it to your PDF using Itext.

Community
  • 1
  • 1
PATRY Guillaume
  • 4,287
  • 1
  • 32
  • 41