全体的な流れとしては、
- 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(); } }