2012-06-27 2 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 е и java.awt.Image как и AWT и Lowagie есть классы, называемые изображения.

+0

Спасибо вам большое, это отлично работает! – user1484901

Смежные вопросы