2015年7月15日水曜日

pdfファイルにJFreeChartのグラフを出力

JFreeChartで出力したグラフをiTextを使ってpdfファイルに張り込む。

全体的な流れとしては、

  1. JFreeChartでグラフを生成
  2. 1.からBufferedImageを生成
  3. ChatUtilityを使ってPNG形式でエンコードしたものをbyteの配列として取得
  4. iTextのDocumentクラスをインスタンス化
  5. byteの配列からImageクラスを生成
  6. Imageのpdfファイル上の貼り付け場所を決める
  7. PdfWriterを生成する
  8. Documentをオープンする
  9. PdfContentByteを取得してimageを張り付ける
  10. 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();
    }
}


0 件のコメント:

コメントを投稿