你好,任何人都可以帮助我在单个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();
}
}
答案 0 :(得分:4)
你已经做了正确的事情,除了循环(我不明白你为什么要画三次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);
这可能比上面的代码段更容易:您使用不同的图表创建不同的PdfTemplate
对象,将它们包含在Image
中并将它们添加到document
。 重要提示:如果您想将图表包装在Image
内,则必须使用较小的矩形,否则,您将无法使用图表单页(由于默认边距)。
如果您想多次添加相同的条形图,不用说,您可以使用相同的模板重复addTemplate()
方法,不止一次坐标。如果将模板包装在Image
对象中,则可以多次将相同的图像添加到document
。