全体的な流れとしては、
- JFreeChartでグラフを生成
- 1.からBufferedImageを生成
- ChatUtilityを使ってPNG形式でエンコードしたものをbyteの配列として取得
- iTextのDocumentクラスをインスタンス化
- byteの配列からImageクラスを生成
- Imageのpdfファイル上の貼り付け場所を決める
- PdfWriterを生成する
- Documentをオープンする
- PdfContentByteを取得してimageを張り付ける
- Documentをクローズする
いつも通り品質は保証しません。
package variouslibraries.javalearning.jfree;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class JFreeChartToPDF {
public static void main(String[] args) {
//グラフを作る
String series1 = "Kyoto";
String series2 = "Hyogo";
String series3 = "Osaka";
String category1 = "Category 1";
String category2 = "Category 2";
String category3 = "Category 3";
String category4 = "Category 4";
String category5 = "Category 5";
String category6 = "Category 6";
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(2.0, series1, category1);
dataset.addValue(3.0, series1, category2);
dataset.addValue(4.0, series1, category3);
dataset.addValue(2.0, series1, category4);
dataset.addValue(1.0, series1, category5);
dataset.addValue(3.0, series1, category6);
dataset.addValue(4.0, series2, category1);
dataset.addValue(1.0, series2, category2);
dataset.addValue(2.0, series2, category3);
dataset.addValue(3.0, series2, category4);
dataset.addValue(1.0, series2, category5);
dataset.addValue(2.0, series2, category6);
dataset.addValue(5.0, series3, category1);
dataset.addValue(3.0, series3, category2);
dataset.addValue(2.0, series3, category3);
dataset.addValue(6.0, series3, category4);
dataset.addValue(5.0, series3, category5);
dataset.addValue(7.0, series3, category6);
JFreeChart chart = ChartFactory.createLineChart("Sample Line Chart", "Category", "Value", dataset, PlotOrientation.VERTICAL, true, true, false);
chart.setAntiAlias(true);
//byteの配列を変更する。
float width = PageSize.A4.getWidth();
float height = PageSize.A4.getHeight();
BufferedImage bufImage = chart.createBufferedImage((int)width, (int) (height/2.0));
byte[] byteArray = null;
try {
byteArray = ChartUtilities.encodeAsPNG(bufImage);
} catch (IOException ex) {
ex.printStackTrace();
}
//pdfファイルを作成する
Document document = new Document(PageSize.A4);
try {
Image image = Image.getInstance(byteArray);
image.setAbsolutePosition(0, document.getPageSize().getHeight() - bufImage.getHeight());
PdfWriter instance = PdfWriter.getInstance(document, new FileOutputStream("PdfSample2.pdf"));
document.open();
PdfContentByte pdfContentByte = instance.getDirectContent();
pdfContentByte.addImage(image);
} catch (BadElementException | IOException ex) {
ex.printStackTrace();
} catch (DocumentException ex) {
ex.printStackTrace();
}
document.close();
}
}

