-5

I need to create a scattered chart in PDF using IText 7.2 .

I tried using JfreeChart but unable to add in IText.

ProgBee
  • 1
  • 1

2 Answers2

-1

There are no direct ways to create charts and graphs using iText 7. You would need to rely on external libraries like JFreeChart to create and export charts as a byte[] image and later use iText 7 Image and ImageDataFactory class that will read this byte[] of image and embed it into PDF. Alternatively, if you have charts or graphs exported as SVG images then we can add SVG directly into PDF files too.

I have created a small example for you that demonstrate how to create bar charts with line graph as an byte[] and later use iText code to embed that charts as an image in PDF. Please configure iText 7.2.1 and JFreeChart 1.5.3 version in your pom.xml. Below example is for bar charts with line graph however you can modify the same for scatter chart. Please refer this link https://www.javatips.net/blog/create-scatter-chart-using-jfreechart. Below code contains logic on how to add graph created in the form of image using iText 7 document.

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;


public class CombineBarAndLineChartExample extends JFrame {

private static final long serialVersionUID = 1 L;

public CombineBarAndLineChartExample(String title) {
    super(title);

    // Create Category plot
    CategoryPlot plot = new CategoryPlot();

    // Add the first dataset and render as bar
    CategoryItemRenderer lineRenderer = new LineAndShapeRenderer();
    plot.setDataset(0, createDataset());
    plot.setRenderer(0, lineRenderer);

    // Add the second dataset and render as lines
    CategoryItemRenderer baRenderer = new BarRenderer();
    plot.setDataset(1, createDataset());
    plot.setRenderer(1, baRenderer);

    // Set Axis
    plot.setDomainAxis(new CategoryAxis("Time"));
    plot.setRangeAxis(new NumberAxis("Value"));

    JFreeChart chart = new JFreeChart(plot);
    chart.setTitle("Combined Bar And Line Chart example");

    ChartPanel panel = new ChartPanel(chart);
    setContentPane(panel);

    BufferedImage objBufferedImage = chart.createBufferedImage(500, 300);
    ByteArrayOutputStream bas = new ByteArrayOutputStream();
    try {
        ImageIO.write(objBufferedImage, "png", bas);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        byte[] byteArray = bas.toByteArray();

        //iText 7 Code to embed the byte[] of image into PDF

        PdfDocument pdfDoc = new PdfDocument(new PdfWriter("src/main/resources/generatedGraphInMage.pdf"));
        Document doc = new Document(pdfDoc, PageSize.A4.rotate());
        Image img = new Image(ImageDataFactory.create(byteArray));

        doc.add(img);
        doc.close();

        //iText 7 code ends

    } catch (Exception e) {

    }
}

private DefaultCategoryDataset createDataset() {

    // First Series
    String series1 = "Vistor";
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(200, series1, "2016-12-19");
    dataset.addValue(150, series1, "2016-12-20");
    dataset.addValue(100, series1, "2016-12-21");
    dataset.addValue(210, series1, "2016-12-22");
    dataset.addValue(240, series1, "2016-12-23");
    dataset.addValue(195, series1, "2016-12-24");
    dataset.addValue(245, series1, "2016-12-25");

    // Second Series
    String series2 = "Unique Visitor";
    dataset.addValue(150, series2, "2016-12-19");
    dataset.addValue(130, series2, "2016-12-20");
    dataset.addValue(95, series2, "2016-12-21");
    dataset.addValue(195, series2, "2016-12-22");
    dataset.addValue(200, series2, "2016-12-23");
    dataset.addValue(180, series2, "2016-12-24");
    dataset.addValue(230, series2, "2016-12-25");

    return dataset;
}

public static void main(String[] args) {
    //SwingUtilities.invokeLater(() -> {
    CombineBarAndLineChartExample example = new CombineBarAndLineChartExample(
        "Line Chart and Bar chart Example");
    // example.setSize(800, 400);
    // example.setLocationRelativeTo(null);
    //example.setVisible(true);
    // });
}

}

S_G
  • 426
  • 2
  • 9
-1
BufferedImage obj=chart.createBufferedImage(250,250);
ByteArrayOutputStream bas = new ByteArrayOutputStream();

try {
    ImageIO.write(obj, "png", bas);
} catch (IOException e) {
    e.printStackTrace();
}

byte[] byteArray=bas.toByteArray();
InputStream in = new ByteArrayInputStream(byteArray);
BufferedImage image = ImageIO.read(in);
File outputfile = new File("src/pathofImage");
ImageIO.write(image, "png", outputfile);

After creating this functionality we need to call image url from IText asusual.

mkl
  • 90,588
  • 15
  • 125
  • 265
ProgBee
  • 1
  • 1