Javafx jfreechart&;itext用于添加多个条形图

Javafx jfreechart&;itext用于添加多个条形图,javafx,itext,jfreechart,Javafx,Itext,Jfreechart,您好,任何人都可以帮助我在一个pdf中添加许多条形图。我有一个代码从d网站创建一个条形图,并保存在pdf格式。但无法将多个条形图保存到单个pdf import com.itextpdf.awt.DefaultFontMapper; import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfTemplate; import com.

您好,任何人都可以帮助我在一个pdf中添加许多条形图。我有一个代码从d网站创建一个条形图,并保存在pdf格式。但无法将多个条形图保存到单个pdf

import com.itextpdf.awt.DefaultFontMapper;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate; 
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;

public class PieChartDemo {
public static void main(String[] args) {

    writeChartToPDF(generateBarChart(), 500, 400, "F:\\pdf\\bar.pdf");
    //TODO: Add code to generate PDFs with charts
}  



public static JFreeChart generateBarChart() {
    DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
    dataSet.setValue(791, "Population", "1750 AD");
    dataSet.setValue(978, "Population", "1800 AD");
    dataSet.setValue(1262, "Population", "1850 AD");
    dataSet.setValue(1650, "Population", "1900 AD");
    dataSet.setValue(2519, "Population", "1950 AD");
    dataSet.setValue(6070, "Population", "2000 AD");


    JFreeChart chart = ChartFactory.createBarChart(
            "World Population growth", "Year", "Population in millions",
            dataSet, PlotOrientation.VERTICAL, false, true, false);

    return chart;
}
public static void writeChartToPDF(JFreeChart chart, int width, int height, String fileName) {
PdfWriter writer = null;

Document document = new Document();

try {
    writer = PdfWriter.getInstance(document, new FileOutputStream(
            fileName));
    document.open();
    PdfContentByte contentByte = writer.getDirectContent();
    PdfTemplate template = contentByte.createTemplate(width, height);
    Graphics2D graphics2d = template.createGraphics(width, height,
            new DefaultFontMapper());
    Rectangle2D rectangle2d = new Rectangle2D.Double(0, 0, width,
            height);
    for(int i=0;i<3;i++){
    chart.draw(graphics2d, rectangle2d);
}

    graphics2d.dispose();
    contentByte.addTemplate(template, 0, 0);

} catch (Exception e) {
    e.printStackTrace();
}
document.close();
}
}
import com.itextpdf.awt.DefaultFontMapper;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.pdf.PdfContentByte;
导入com.itextpdf.text.pdf.PdfTemplate;
导入com.itextpdf.text.pdf.PdfWriter;
导入java.awt.Graphics2D;
导入java.awt.geom.Rectangle2D;
导入java.io.FileOutputStream;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.data.category.DefaultCategoryDataset;
导入org.jfree.data.general.DefaultPieDataset;
公共课演示{
公共静态void main(字符串[]args){
writeChartToPDF(generateBarChart(),500400,“F:\\pdf\\bar.pdf”);
//TODO:添加代码以使用图表生成PDF
}  
公共静态JFreeChart generateBarChart(){
DefaultCategoryDataset数据集=新的DefaultCategoryDataset();
setValue(791,“人口”,“公元1750年”);
dataSet.setValue(978,“人口”,“公元1800年”);
setValue(1262,“人口”,“公元1850年”);
dataSet.setValue(1650,“人口”,“公元1900年”);
dataSet.setValue(2519,“人口”,“公元1950年”);
setValue(6070,“人口”,“公元2000年”);
JFreeChart chart=ChartFactory.createBarChart(
“世界人口增长”、“年”、“百万人口”,
数据集,PlotOrientation.VERTICAL,false,true,false);
收益表;
}
公共静态void writeChartToPDF(JFreeChart图表、整型宽度、整型高度、字符串文件名){
PdfWriter writer=null;
文档=新文档();
试一试{
writer=PdfWriter.getInstance(文档,新文件输出流(
文件名);
document.open();
PdfContentByte contentByte=writer.getDirectContent();
PdfTemplate template=contentByte.createTemplate(宽度、高度);
Graphics2D Graphics2D=模板.createGraphics(宽度、高度、,
新的DefaultFontMapper());
Rectangle2D Rectangle2D=新矩形2D.双精度(0,0,width,
高度);

对于(int i=0;i除了循环之外,您已经在做正确的事情了(我不明白您为什么要画三次相同的
图表)

请看一下iText官方网站上的示例。在上,您可以看到两个不同的图表,每个图表占用一半的页面空间

PdfContentByte cb = writer.getDirectContent();
// define a width and a height
// in this case, I took the total width of the page
// and half the height of the page
float width = PageSize.A4.getWidth();
float height = PageSize.A4.getHeight() / 2;
// Create a Form XObject for a Pie chart
// You already have this part in your own code
PdfTemplate pie = cb.createTemplate(width, height);
Graphics2D g2d1 = new PdfGraphics2D(pie, width, height);
Rectangle2D r2d1 = new Rectangle2D.Double(0, 0, width, height);
getPieChart().draw(g2d1, r2d1);
g2d1.dispose();
cb.addTemplate(pie, 0, height);
// Create a Form XObject for a Bar chart
PdfTemplate bar = cb.createTemplate(width, height);
Graphics2D g2d2 = new PdfGraphics2D(bar, width, height);
Rectangle2D r2d2 = new Rectangle2D.Double(0, 0, width, height);
getBarChart().draw(g2d2, r2d2);
g2d2.dispose();
cb.addTemplate(bar, 0, 0);
getPieChart()
getBarChart()
方法都创建了一个
JFreeChart
对象

如您所见,您始终必须创建一个具有特定维度的
PdfTemplate
对象(也称为表单XObject),并将图表绘制到该
PdfTemplate
上。从那时起,您可以在页面上定位
PdfTemplate
。如果要切换到新页面,请执行以下操作:

document.newPage();
另外:如果不想使用绝对坐标添加图表,可以将
PdfTemplate
包装在
图像中
。将
cb.addTemplate()
方法替换为:

Image img = Image.getInstance(pie);
document.add(img);
img = Image.getInstance(bar);
document.add(img);
这可能比上面的代码片段更容易:使用不同的图表创建不同的
PdfTemplate
对象,将它们包装在
图像中,并将它们添加到
文档中。重要提示:如果要将图表包装在
图像中,必须使用较小的矩形,因为e否则,您将无法将图表放在单个页面上(由于默认页边距)


如果要多次添加同一条形图,不用说,您可以重复
addTemplate()
方法多次使用相同的模板和不同的坐标。如果将模板包装在
图像
对象中,则可以多次将相同的图像添加到
文档中。

除了循环之外,您已经在做正确的事情了(我不明白你为什么要画三次相同的
图表)

请看一下iText官方网站上的示例。在上,您可以看到两个不同的图表,每个图表占用一半的页面空间

PdfContentByte cb = writer.getDirectContent();
// define a width and a height
// in this case, I took the total width of the page
// and half the height of the page
float width = PageSize.A4.getWidth();
float height = PageSize.A4.getHeight() / 2;
// Create a Form XObject for a Pie chart
// You already have this part in your own code
PdfTemplate pie = cb.createTemplate(width, height);
Graphics2D g2d1 = new PdfGraphics2D(pie, width, height);
Rectangle2D r2d1 = new Rectangle2D.Double(0, 0, width, height);
getPieChart().draw(g2d1, r2d1);
g2d1.dispose();
cb.addTemplate(pie, 0, height);
// Create a Form XObject for a Bar chart
PdfTemplate bar = cb.createTemplate(width, height);
Graphics2D g2d2 = new PdfGraphics2D(bar, width, height);
Rectangle2D r2d2 = new Rectangle2D.Double(0, 0, width, height);
getBarChart().draw(g2d2, r2d2);
g2d2.dispose();
cb.addTemplate(bar, 0, 0);
getPieChart()
getBarChart()
方法都创建了一个
JFreeChart
对象

如您所见,您始终必须创建一个具有特定维度的
PdfTemplate
对象(也称为表单XObject),并将图表绘制到该
PdfTemplate
上。从那时起,您可以在页面上定位
PdfTemplate
。如果要切换到新页面,请执行以下操作:

document.newPage();
另外:如果不想使用绝对坐标添加图表,可以将
PdfTemplate
包装在
图像中
。将
cb.addTemplate()
方法替换为:

Image img = Image.getInstance(pie);
document.add(img);
img = Image.getInstance(bar);
document.add(img);
这可能比上面的代码片段更容易:使用不同的图表创建不同的
PdfTemplate
对象,将它们包装在
图像中,并将它们添加到
文档中。重要提示:如果要将图表包装在
图像中,必须使用较小的矩形,因为e否则,您将无法将图表放在单个页面上(由于默认页边距)


如果要多次添加同一条形图,不用说,您可以重复
addTemplate()
方法多次使用相同的模板和不同的坐标。如果将模板包装在
图像
对象中,可以多次将相同的图像添加到
文档

我只是要求概述。我将在d pdf中放置不同的图表。谢谢……你说“我只是要求概述”是什么意思?我的回答解释了如何在一个PDF中放置不同的图表。实际上,我使用desmoj lib,它返回许多直方图。我正在为所有