`
jinxhj2003
  • 浏览: 148986 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

在Web上用iText和JFreeChart将图形报表导出到PDF

    博客分类:
  • java
阅读更多
最近项目中需要一个将生成的图形报表导出到PDF文件的功能。在图形上面本打算采用Flash进行展示,可是没有找到怎样直接将Flash导入PDF的方法,应该只有先生成图片才可以吧?(知道怎样做的大侠可以给个方法,先谢了。)于是改用JFreeChart来画图。生成PDF方面工具也很多,iText还比较成熟,于是选用它来生成PDF。

一开始本想图个省事,直接将网页转换成PDF文件。但是了n次后发现,这样的做法会导致图表严重变形,根本没法看,没办法,看来只能利用iText的API一点一点的做了。还好,iText的确够强大。就目前来看,完全可以处理项目的需求。下面就是我用iText结合JFreeChart在Web中将图表转换为PDF的方法。

本项目采用Struts2,分两个方法来处理,一个叫exportDeviceStat,调用它导出PDF,另一个叫getJFreeChart,调用它生成图形。下面直接上代码了:





          /**

Java代码
1. * 将图表导出到PDF  
2. * @return 
3. */  
4.public String exportDeviceStat() {  
5.    HttpServletResponse response = ServletActionContext.getResponse();  
6.      
7.    String fileTitle = year + "年" + month + "月各办公区设备运行情况统计";  
8.      
9.    response.setContentType("application/pdf;charset=utf-8");  
10.    response.addHeader("Content-Disposition", "attachment;filename=" + encodeFilename(fileTitle) + ".pdf");  
11. 
12.    //获得办公区列表  
13.    List<Location> locationList = SystemCache.getLocationListFromCache();  
14.      
15.    if (null != locationList && locationList.size() > 0) {  
16.          
17.        //创建Document对象  
18.        Document document = new Document();  
19. 
20.        try {  
21.            //创建PDF对象实例,直接输出到网页上  
22.            PdfWriter.getInstance(document, response.getOutputStream());  
23. 
24.            //设置文档字体  
25.            BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);  
26.            com.lowagie.text.Font fontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL, Color.BLACK);  
27.              
28.            // 添加PDF文档的一些信息  
29.            document.addTitle(fileTitle);  
30.            document.addAuthor("设备运行情况统计");  
31.            document.addSubject("");  
32.            document.addKeywords("");  
33.            document.addCreator("设备运行情况统计");  
34.              
35.                HeaderFooter footer = new HeaderFooter(new Phrase(" 第", fontChinese), new Phrase("页 ", fontChinese));  
36.            footer.setBorder(Rectangle.NO_BORDER);  
37.                footer.setAlignment(Element.ALIGN_RIGHT);  
38.                document.setFooter(footer);  
39. 
40.            // 打开文档,将要写入内容  
41.            document.open();  
42. 
43.            // 文档标题标题  
44.            document.add(new Paragraph(fileTitle, fontChinese));  
45. 
46.            // 换行  
47.            document.add(Chunk.NEWLINE);  
48.   
49.            // 插入表格  
50.            com.lowagie.text.Font f8 = new com.lowagie.text.Font(bfChinese, 8, com.lowagie.text.Font.BOLD);  
51.            com.lowagie.text.Font f12 = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.BOLD);  
52. 
53.            //生成每个办公区的统计报表  
54.            for (Location location : locationList) {  
55.                //生成一个2列的表格  
56.                PdfPTable table = new PdfPTable(2);  
57.                  
58.                // 宽度定位100%  
59.                table.setWidthPercentage(100);  
60.                table.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
61.                  
62.                // 创建第一行  
63.                PdfPCell cell = new PdfPCell();  
64.                cell.setBorderColor(new Color(255, 255, 255));  
65.                cell.setBackgroundColor(new Color(24, 198, 248));  
66.                cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
67.                cell.setColspan(2);  
68.                cell.setVerticalAlignment(PdfPCell.ALIGN_CENTER);  
69.                  
70.                //第一行中显示的文字  
71.                cell.setPhrase(new Paragraph(location.getLocationName() + "办公区设备运行情况统计", f12));  
72.                table.addCell(cell);  
73.                  
74.                //插入统计图  
75.                PdfPCell newcell = new PdfPCell();  
76.                  
77.                newcell.setBorderColor(new Color(255, 255, 255));  
78.                //设备故障率统计,JFreeChart生成图表并返回  
79.                Image img = Image.getInstance("http://localhost:8080/DeviceStat/getJFreeChart.html?method=getDeviceNormalCount&locationId=" + location.getLocationId() + "&year=" + year + "&month=" + month);  
80.                img.setAbsolutePosition(0, 0);  
81.                newcell.setImage(img);  
82.                table.addCell(newcell);  
83.                  
84.                //故障类型统计,JFreeChart生成图表并返回  
85.                img = Image.getInstance("http://localhost:8080/DeviceStat/getJFreeChart.html?method=getDeviceAbnormalCount&locationId=" + location.getLocationId() + "&year=" + year + "&month=" + month);  
86.                img.setAbsolutePosition(0, 0);  
87.                newcell.setImage(img);  
88.                table.addCell(newcell);  
89.                  
90.                  
91.                document.add(table);  
92.            }  
93.              
94.        } catch (DocumentException de) {  
95.            System.err.println(de.getMessage());  
96.        } catch (IOException ioe) {  
97.            System.err.println(ioe.getMessage());  
98.        } finally {  
99.            // 关闭打开的文档  
100.            document.close();  
101.        }  
102.    }  
103.    return NONE;  
104.} 
* 将图表导出到PDF
* @return
*/
public String exportDeviceStat() {
HttpServletResponse response = ServletActionContext.getResponse();

String fileTitle = year + "年" + month + "月各办公区设备运行情况统计";

response.setContentType("application/pdf;charset=utf-8");
response.addHeader("Content-Disposition", "attachment;filename=" + encodeFilename(fileTitle) + ".pdf");

//获得办公区列表
List<Location> locationList = SystemCache.getLocationListFromCache();

if (null != locationList && locationList.size() > 0) {

//创建Document对象
Document document = new Document();

try {
  //创建PDF对象实例,直接输出到网页上
  PdfWriter.getInstance(document, response.getOutputStream());

   //设置文档字体
   BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
   com.lowagie.text.Font fontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL, Color.BLACK);

   // 添加PDF文档的一些信息
   document.addTitle(fileTitle);
  document.addAuthor("设备运行情况统计");
  document.addSubject("");
   document.addKeywords("");
   document.addCreator("设备运行情况统计");

    HeaderFooter footer = new HeaderFooter(new Phrase(" 第", fontChinese), new Phrase("页 ", fontChinese));
   footer.setBorder(Rectangle.NO_BORDER);
    footer.setAlignment(Element.ALIGN_RIGHT);
    document.setFooter(footer);

// 打开文档,将要写入内容
document.open();

// 文档标题标题
document.add(new Paragraph(fileTitle, fontChinese));

// 换行
document.add(Chunk.NEWLINE);

// 插入表格
com.lowagie.text.Font f8 = new com.lowagie.text.Font(bfChinese, 8, com.lowagie.text.Font.BOLD);
com.lowagie.text.Font f12 = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.BOLD);

//生成每个办公区的统计报表
for (Location location : locationList) {
//生成一个2列的表格
PdfPTable table = new PdfPTable(2);

// 宽度定位100%
table.setWidthPercentage(100);
table.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);

// 创建第一行
PdfPCell cell = new PdfPCell();
cell.setBorderColor(new Color(255, 255, 255));
cell.setBackgroundColor(new Color(24, 198, 248));
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setColspan(2);
cell.setVerticalAlignment(PdfPCell.ALIGN_CENTER);

//第一行中显示的文字
cell.setPhrase(new Paragraph(location.getLocationName() + "办公区设备运行情况统计", f12));
table.addCell(cell);

//插入统计图
PdfPCell newcell = new PdfPCell();

newcell.setBorderColor(new Color(255, 255, 255));
//设备故障率统计,JFreeChart生成图表并返回
Image img = Image.getInstance("http://localhost:8080/DeviceStat/getJFreeChart.html?method=getDeviceNormalCount&locationId=" + location.getLocationId() + "&year=" + year + "&month=" + month);
img.setAbsolutePosition(0, 0);
newcell.setImage(img);
table.addCell(newcell);

//故障类型统计,JFreeChart生成图表并返回
img = Image.getInstance("http://localhost:8080/DeviceStat/getJFreeChart.html?method=getDeviceAbnormalCount&locationId=" + location.getLocationId() + "&year=" + year + "&month=" + month);
img.setAbsolutePosition(0, 0);
newcell.setImage(img);
table.addCell(newcell);


document.add(table);
}

} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
} finally {
// 关闭打开的文档
document.close();
}
}
return NONE;
}

          /**

Java代码
1. * 用JFreeChart生成统计图  
2. * @return 
3. */  
4.public String getJFreeChart() {  
5.    HttpServletResponse response = ServletActionContext.getResponse();  
6.      
7.    response.setContentType("image/jpeg;charset=utf-8");  
8.      
9.    //获得办公区信息  
10.    Location location = SystemCache.getLocationByIdFromCache(locationId);  
11.      
12.    if (null != location) {  
13.        DefaultPieDataset data = getDataSet(method, locationId, year, month);  
14.        JFreeChart chart = ChartFactory.createPieChart("getDeviceNormalCount".equals(method) ? "办公区设备运行情况统计" : "故障类型分布", data, true, false, false);  
15.          
16.        chart.setBorderPaint(new Color(255,255,255));  
17.        chart.setBorderVisible(false);  
18.        chart.getTitle().setFont(new Font("宋体", Font.BOLD,12));  
19.        chart.getLegend().setItemFont(new Font("宋体", Font.BOLD,12));  
20.        PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象  
21.        piePlot.setBackgroundPaint(new Color(255,255,255));  
22.        piePlot.setOutlineVisible(false);  //无边框  
23.        piePlot.setNoDataMessage("暂无统计数据");  //设置无数据时的显示内容  
24.            piePlot.setLabelFont(new Font("宋体",Font.BOLD,12));     //饼图旁边的中文  
25.        //按百分比显示  
26.            piePlot.setLabelGenerator(new  StandardPieSectionLabelGenerator(     
27.                        "{0}:{2}", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")  
28.                ));  
29.          
30.        try {  
31.            //输出图标  
32.            ChartUtilities.writeChartAsJPEG(response.getOutputStream(),  
33.                1,chart,400,300,null);  
34.              
35.            response.flushBuffer();  
36.        } catch (IOException e) {  
37.            // TODO Auto-generated catch block  
38.            e.printStackTrace();  
39.        } finally {  
40.              
41.        }  
42.    }  
43.      
44.    return NONE;  
45.}  
46. 
47./** 
48. * 获得JFreeChart需要的数据 
49. * @param method 
50. * @param locationId 
51. * @param year 
52. * @param month 
53. * @return 
54. */ 
55.private static DefaultPieDataset getDataSet(String method, Integer locationId, Integer year, Integer month) {  
56.    DefaultPieDataset dataset = new DefaultPieDataset();  
57.      
58.    if ("getDeviceNormalCount".equals(method)) {  
59.        Integer normalCount = SystemCache.getDeviceStatNormalCountFromCache(locationId, year, month);  
60.        Integer abNormalCount = SystemCache.getDeviceStatAbnormalCountFromCache(locationId, year, month);  
61.          
62.        if (null != normalCount && 0 != normalCount) {  
63.            dataset.setValue("设备正常率", normalCount);  
64.        }   
65.        if (null != abNormalCount && 0 != abNormalCount) {  
66.            dataset.setValue("设备故障率", abNormalCount);  
67.        }  
68.    } else {  
69.        List<DeviceBreakdownTypeCount> countList = SystemCache.getDeviceBreakdownTypeCountFromCache(locationId, year, month);  
70.        if (null != countList && countList.size() > 0) {  
71.            for (DeviceBreakdownTypeCount count : countList) {  
72.                dataset.setValue(Constant.DEVICE_BREAKDOWN_TYPE_DESC[count.getBreakdownType()], count.getBreakdownTypeCount());  
73.            }  
74.        }  
75.    }  
76.      
77.    return dataset;  
78.} 
* 用JFreeChart生成统计图
* @return
*/
public String getJFreeChart() {
HttpServletResponse response = ServletActionContext.getResponse();

response.setContentType("image/jpeg;charset=utf-8");

//获得办公区信息
Location location = SystemCache.getLocationByIdFromCache(locationId);

if (null != location) {
DefaultPieDataset data = getDataSet(method, locationId, year, month);
JFreeChart chart = ChartFactory.createPieChart("getDeviceNormalCount".equals(method) ? "办公区设备运行情况统计" : "故障类型分布", data, true, false, false);

chart.setBorderPaint(new Color(255,255,255));
chart.setBorderVisible(false);
chart.getTitle().setFont(new Font("宋体", Font.BOLD,12));
chart.getLegend().setItemFont(new Font("宋体", Font.BOLD,12));
PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象
piePlot.setBackgroundPaint(new Color(255,255,255));
piePlot.setOutlineVisible(false);  //无边框
piePlot.setNoDataMessage("暂无统计数据");  //设置无数据时的显示内容
    piePlot.setLabelFont(new Font("宋体",Font.BOLD,12));     //饼图旁边的中文
//按百分比显示
    piePlot.setLabelGenerator(new  StandardPieSectionLabelGenerator(  
                    "{0}:{2}", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")
            ));
   
try {
//输出图标
ChartUtilities.writeChartAsJPEG(response.getOutputStream(),
1,chart,400,300,null);

response.flushBuffer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {

}
}

return NONE;
}

/**
* 获得JFreeChart需要的数据
* @param method
* @param locationId
* @param year
* @param month
* @return
*/
private static DefaultPieDataset getDataSet(String method, Integer locationId, Integer year, Integer month) {
DefaultPieDataset dataset = new DefaultPieDataset();

if ("getDeviceNormalCount".equals(method)) {
Integer normalCount = SystemCache.getDeviceStatNormalCountFromCache(locationId, year, month);
Integer abNormalCount = SystemCache.getDeviceStatAbnormalCountFromCache(locationId, year, month);

if (null != normalCount && 0 != normalCount) {
dataset.setValue("设备正常率", normalCount);
}
if (null != abNormalCount && 0 != abNormalCount) {
dataset.setValue("设备故障率", abNormalCount);
}
} else {
List<DeviceBreakdownTypeCount> countList = SystemCache.getDeviceBreakdownTypeCountFromCache(locationId, year, month);
if (null != countList && countList.size() > 0) {
for (DeviceBreakdownTypeCount count : countList) {
dataset.setValue(Constant.DEVICE_BREAKDOWN_TYPE_DESC[count.getBreakdownType()], count.getBreakdownTypeCount());
}
}
}

return dataset;



   最后运行的结果:
分享到:
评论
1 楼 xm_koma 2010-08-02  
有没有将JFreeChart生成的图表导出到Excel中的例子呢?

相关推荐

    java报表jfreechart开发

    JFreeChart支持将图表导出为PDF格式。 ##### 16.2 什么是Acrobat PDF Acrobat PDF是一种用于文档交流的标准格式。 ##### 16.3 IText IText是一个用于创建PDF文档的Java库。 ##### 16.4 Graphics2D `Graphics2D`是...

    在JSP中导出pdf和excel.pdf

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而导出PDF和Excel文件是常见的需求,比如为了报表或数据分析。在本文中,我们将深入探讨如何在JSP环境中实现这一功能。 首先,我们需要...

    jfreechart-1.0.13 jar包

    1. **iText-2.1.5.jar**:这是一个用于生成 PDF 文档的库,可以与 JFreeChart 结合使用,方便将图表导出为 PDF 格式。 2. **jcommon-1.0.16.jar**:这是 JFreeChart 的一个基础库,包含了颜色、字体、几何形状等...

    jfreechart jar

    1. iText-2.1.5.jar:这是一个用于生成PDF文档的Java库,有时在需要将JFreeChart图表导出为PDF格式时会用到。 2. jcommon-1.0.16.jar:这是JFreeChart的一个依赖库,提供了通用的数据结构和图形绘制的支持。 3. ...

    JFreeChart,Java开源图表框架

    - **绘制图表**:将图表添加到组件(如`JFrame`)上显示,或导出为图像文件。 **3. ** **实战示例** 以下是一个简单的柱状图创建示例: ```java import org.jfree.chart.ChartFactory; import org.jfree.chart....

    JavaWeb开发技术方案宝典--报表打印方案(报表打印方案要点代码)

    1. **JasperReports**: JasperReports是一款开源的报表工具,它支持多种数据源,如数据库、CSV文件等,可以创建复杂的报告,并且能够导出到PDF、HTML、Excel等多种格式。在JavaWeb应用中,JasperReports通常与...

    runqian_report4.jar、runqianReport4Applet.jar

    这些库可能包括PDF生成器、图形渲染库等,用于支持高质量的报表导出和打印。例如,可能会有Apache PDFBox或iText这样的库,用于生成PDF格式的报表;也可能有JFreeChart等库用于图表的绘制。 在集成润乾报表时,...

    ireport报表工具的配置、使用、开发手册

    确保包含所有必需的依赖,如JFreeChart和iText库,这些库支持图表和PDF输出。 - 配置数据库连接:JasperReport支持多种数据库,需要配置数据库驱动和连接参数,如URL、用户名和密码,以访问数据源生成报表。 2. **...

    JasperReports开源报表概述和运行原理.doc

    - **iText**:用于生成PDF和RTF文档,使JasperReports能够导出这两种格式的报表。 - **JFreeChart**:提供了丰富的图表生成功能,如饼图、条形图、线图等,用于报表中的可视化数据展示。 - **Apache POI**:允许...

    JFreeChart速查手册HandBood系列(By FengGe整理)

    4. **支持多种输出格式**:除了在屏幕上显示,JFreeChart还能导出图表为PNG、JPEG、PDF、SVG等多种格式,便于集成到报告或网页中。 5. **与Swing和JavaFX的集成**:JFreeChart可以无缝嵌入到Swing或JavaFX组件中,...

    jasperreport需要的jar包

    5. **导出报表**: 最后,通过JasperExportManager将报表导出为用户需要的格式。 **JasperReport 需要的JAR包** 1. **jasperreports-*.jar**: 主要的JasperReport库,包含了报表设计、编译、填充和导出的所有功能。...

    JasperReports & iReport

    3. **生成报表**:将填充后的报表导出为PDF或其他格式,供用户查看。 通过这种方式,不仅可以快速高效地完成报表设计,还能充分利用JasperReports的强大功能,确保报表质量的同时提升用户体验。

    iReport web开发配置向导

    2. **外部 TTF 字体**:如果需要使用外部的 TrueType 字体文件,则需要将字体文件放置在 `iReport-0.5.1/fonts` 目录下,并在报表设计时选择对应的字体文件。 3. **网页字体**:对于网页展示的报表,需要在 WEB-INF/...

    jasperreport 要用到的jar包

    JasperReport是一款强大的开源报表工具,它允许开发者创建复杂、美观的报告,并能与各种Java应用程序和Web应用程序无缝集成。在Java开发环境中,JasperReport以其灵活的数据展示和丰富的图表功能受到广泛欢迎。本...

    iReport4.5.1使用详解

    JasperReport是一个强大的开源报表生成工具,它采用Java编写,适用于各种Java应用程序,包括J2EE和Web应用,可以生成包含丰富页面内容的报表,并将其导出为PDF、HTML或XML格式。而iReport是与JasperReport配套的开源...

    Struts2整合JasperReport所需要的jar包

    - 首先,将上述jar包添加到项目的类路径中,通常是在WEB-INF/lib目录下。 - 在Struts2的配置文件`struts.xml`中,定义一个Action类,该类负责生成报告。 - 实现Action类,包括获取报表参数、填充数据源、编译报表...

    jasperReport所需要的包很全

    5. **JFreeChart** 和 **JCommon**:这两个库用于创建图表,JFreeChart提供了丰富的图表类型,如柱状图、饼图、线图等,JCommon则是它们的基础库,包含了一些通用的图形和组件。 6. **PDF、XLS、HTML、CSV等导出...

    Report

    在这个场景中,"Report"可能涉及Java中的报表工具、框架和库,如JasperReports、iText、BIRT等。 1. **JasperReports**:这是一个强大的开源报表引擎,允许开发者设计复杂的报表,并能在多种格式下导出,如PDF、...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics