【问题标题】:jfreechart & itext for adding many number of barchartsjfreechart & itext 用于添加许多条形图
【发布时间】:2014-06-04 06:08:52
【问题描述】:

你好,任何人都可以帮助我将许多条形图添加到单个 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();
}
}

【问题讨论】:

    标签: javafx itext jfreechart


    【解决方案1】:

    除了循环之外,您已经在做正确的事情了(我不明白为什么您要绘制相同的 chart 三次)。

    请查看 iText 官方网站上的 DirectorCharts 示例。在director_charts.pdf 上,您可以看到两个不同的图表,每个图表占据了页面空间的一半。

    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 对象(又名Form XObject)并将图表绘制到该PdfTemplate 上。从那一刻起,您可以将PdfTemplate 定位在页面上。如果要切换到新页面,请执行以下操作:

    document.newPage();
    

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

    Image img = Image.getInstance(pie);
    document.add(img);
    img = Image.getInstance(bar);
    document.add(img);
    

    这可能比上面的代码 sn-p 更容易:您使用不同的图表创建不同的 PdfTemplate 对象,将它们包装在 Image 中并将它们添加到 document重要提示:如果要将图表包裹在 Image 中,则必须使用较小的矩形,否则,您将无法将图表放在单个页面上(由于默认边距)。

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

    【讨论】:

    • 我只是要求概述一下。我将在 d pdf 中放入不同的图表。谢谢...
    • 您所说的“我只是要求概览”是什么意思?我的回答解释了如何将不同的图表放在一个 PDF 中。
    • 实际上我使用了 desmoj lib,它返回了许多直方图。我正在为所有直方图准备图表。我想将所有图表添加到单个 pdf 中。但你的回答对我帮助很大。谢谢...
    • 先生,我对这个编码有一些疑问,你能亲自帮助我吗?你可以给我你的邮件ID,否则你可以发邮件给我。 srini26juin@yahoo.com 如果可能的话。
    • 该特权仅供客户使用。如果您不是客户并且有问题,则必须在此处发布。如果您需要个人建议,您将收到发票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多