2012-06-27 56 views
2

我使用JFreeChart 1.0.9創建圖表,iText 1.3.1將此圖表顯示在PDF文件中。 要做到這一點,我創建一個JFreeChart的,然後將其轉換爲一個字節數組:JFreeChart&iText:創建pdf時的黑色圖像

final TimeSeriesCollection dataset = new TimeSeriesCollection(); 
final TimeSeries s1 = new TimeSeries("Series 1", Minute.class); 
s1.add(new Minute(0, 0, 7, 12, 2003), 1.2); 
s1.add(new Minute(30, 12, 7, 12, 2003), 3.0); // 12h30 => value = 3 
s1.add(new Minute(15, 14, 7, 12, 2003), 8.0); 

final TimeSeries s2 = new TimeSeries("Series 2", Minute.class); 
s2.add(new Minute(0, 3, 7, 12, 2003), 0.0); 
s2.add(new Minute(30, 9, 7, 12, 2003), 0.0); 
s2.add(new Minute(15, 10, 7, 12, 2003), 0.0); 

dataset.addSeries(s1); 
dataset.addSeries(s2); 
XYDataset dataset2 = dataset; 

final JFreeChart chart = ChartFactory.createTimeSeriesChart(
      "Sample Chart", 
      "Date", 
      "Value", 
      dataset2, 
      true, 
      true, 
      false 
); 
chart.setBackgroundPaint(Color.white); 
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); 

BufferedImage originalImage = chart.createBufferedImage(500, 300, info); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(originalImage, "jpg", baos); 
byte[] imageInByte = baos.toByteArray(); 

那麼我乾脆把這個字節數組中的PDF文件利用iText如下:

Document document=new Document(); 
PdfWriter.getInstance(document,new FileOutputStream("hello.pdf")); 
document.open(); 

Image image = Image.getInstance(imageInByte); 
document.add(image); 

document.close(); 

但是當我打開我的PDF文件時,我的圖像應該是全黑的區域。

您是否瞭解可能的原因?

+0

iText 1.3.1,真的嗎?此版本超過[7歲](http://itextpdf.com/history/?branch=10&node=13)!我不是說這是你問題的原因,而跳到最新版本(5.3.0)將解決它,但如果我是你,我會試試看... –

+1

我沒有選擇關於我使用的版本... – user1484901

回答

2

它看起來像在轉換過程中圖像被反轉。試試下面的代碼

package demo; 

import java.awt.Color; 
import java.io.ByteArrayOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.time.Minute; 
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.data.xy.XYDataset; 

import com.lowagie.text.Document; 
import com.lowagie.text.DocumentException; 
import com.lowagie.text.pdf.PdfWriter; 


public class PDF { 

    public static void main(String[] args) { 
     final TimeSeriesCollection dataset = new TimeSeriesCollection(); 
     final TimeSeries s1 = new TimeSeries("Series 1", Minute.class); 
     s1.add(new Minute(0, 0, 7, 12, 2003), 1.2); 
     s1.add(new Minute(30, 12, 7, 12, 2003), 3.0); // 12h30 => value = 3 
     s1.add(new Minute(15, 14, 7, 12, 2003), 8.0); 

     final TimeSeries s2 = new TimeSeries("Series 2", Minute.class); 
     s2.add(new Minute(0, 3, 7, 12, 2003), 0.0); 
     s2.add(new Minute(30, 9, 7, 12, 2003), 0.0); 
     s2.add(new Minute(15, 10, 7, 12, 2003), 0.0); 

     dataset.addSeries(s1); 
     dataset.addSeries(s2); 
     XYDataset dataset2 = dataset; 

     final JFreeChart chart = ChartFactory.createTimeSeriesChart(
        "Sample Chart", 
        "Date", 
        "Value", 
        dataset2, 
        true, 
        true, 
        false 
     ); 
     chart.setBackgroundPaint(Color.white); 
     java.awt.Image originalImage = chart.createBufferedImage(500, 300); 
     try {   
      Document document=new Document(); 
      PdfWriter.getInstance(document,new FileOutputStream("hello.pdf")); 
      document.open(); 
      com.lowagie.text.Image image1 = com.lowagie.text.Image.getInstance(originalImage,Color.white); 
      document.add(image1); 
      document.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (DocumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

利用iText您的最新版本,我得到這個PDF

enter image description here

希望你將得到相同的

我所做的follwing改變你的代碼

java.awt.Image originalImage = chart.createBufferedImage(500, 300); 

已移除

ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); 

由於不需要。我還刪除了ByteArrayOutputStream

com.lowagie.text.Image image1 = com.lowagie.text.Image.getInstance(originalImage,Color.white); 

注意更換它使用全名時,com.lowagie.text.Imag e和java.awt.Image既是AWT和Lowagie上課稱爲圖像。

+0

非常感謝你,它的作品很棒! – user1484901