1. PDF生成

2. iText

iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库

坐标

  1. <dependency>
  2. <groupId>com.lowagie</groupId>
  3. <artifactId>itext</artifactId>
  4. <version>2.1.7</version>
  5. </dependency>
  1. package com.itheima.app;
  2. import com.lowagie.text.Document;
  3. import com.lowagie.text.DocumentException;
  4. import com.lowagie.text.Paragraph;
  5. import com.lowagie.text.pdf.PdfWriter;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. public class ItextDemo {
  9. public static void main(String[] args) {
  10. try {
  11. Document document = new Document();
  12. PdfWriter.getInstance(document, new FileOutputStream("D:\\test.pdf"));
  13. document.open();
  14. document.add(new Paragraph("hello itext"));
  15. document.close();
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (DocumentException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }

3. JasperReports

JasperReports是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。一般情况下,JasperReports会结合Jaspersoft Studio(模板设计器)使用导出PDF报表。

坐标

  1. <dependency>
  2. <groupId>net.sf.jasperreports</groupId>
  3. <artifactId>jasperreports</artifactId>
  4. <version>6.8.0</version>
  5. </dependency>

将 jrxml文件 复制到resource目录下

编写java类

  1. @Test
  2. public void testJasperReports()throws Exception{
  3. String jrxmlPath =
  4. "D:\\ideaProjects\\projects111\\jasperdemo\\src\\main\\resources\\demo.jrxml";
  5. String jasperPath =
  6. "D:\\ideaProjects\\projects111\\jasperdemo\\src\\main\\resources\\demo.jasper";
  7. //编译模板
  8. JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
  9. //构造数据
  10. Map paramters = new HashMap();
  11. paramters.put("reportDate","2019-10-10");
  12. paramters.put("company","itcast");
  13. List<Map> list = new ArrayList();
  14. Map map1 = new HashMap();
  15. map1.put("name","xiaoming");
  16. map1.put("address","beijing");
  17. map1.put("email","xiaoming@itcast.cn");
  18. Map map2 = new HashMap();
  19. map2.put("name","xiaoli");
  20. map2.put("address","nanjing");
  21. map2.put("email","xiaoli@itcast.cn");
  22. list.add(map1);
  23. list.add(map2);
  24. //填充数据
  25. JasperPrint jasperPrint =
  26. JasperFillManager.fillReport(jasperPath,
  27. paramters,
  28. new JRBeanCollectionDataSource(list));
  29. //输出文件
  30. String pdfPath = "D:\\test.pdf";
  31. JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
  32. }

3.1. JasperReports原理

09. PDF生成 - 图1

  • JRXML:报表填充模板,本质是一个xml文件
  • Jasper:由JRXML模板编译成的二进制文件,用于代码填充数据
  • Jrprint:当用数据填充完Jasper后生成的对象,用于输出报表
  • Exporter:报表输出的管理类,可以指定要输出的报表为何种格式
  • PDF/HTML/XML:报表形式

4. 模板设计器Jaspersoft Studio

Jaspersoft Studio是一个图形化的报表设计工具,可以非常方便的设计出PDF报表模板文件(其实就是一个xml文件),再结合JasperReports使用,就可以渲染出PDF文件。

下载地址:https://community.jaspersoft.com/community-download

创建新的项目

09. PDF生成 - 图2

5. 动态数据填充

Parameters通常用来展示单个数据,Fields通常用来展示需要循环的列表数据。

09. PDF生成 - 图3

在Parameters上点击右键,创建一个Parameter参数 以key value形式

5.1. JDBC数据源数据填充

09. PDF生成 - 图4

右键data adapters 创建新的数据源

09. PDF生成 - 图5

09. PDF生成 - 图6

选择mysql驱动

09. PDF生成 - 图7

并且添加驱动jar包

在Outline视图中,右键点击工程名,选择Database and Query菜单

09. PDF生成 - 图8

切换数据源

09. PDF生成 - 图9

添加列名

09. PDF生成 - 图10

查询后的字段在Fields中

09. PDF生成 - 图11

5.2. JavaBean数据源数据填充

在Fields处点击右键创建新的Field

09. PDF生成 - 图12

创建完成后在Properties属性面板中修改Field的名称

09. PDF生成 - 图13

使用此种JavaBean数据源数据填充方式,无法正常进行预览,因为这些动态Fields需要在Java程序中动态进行数据填充。

5.3. JDBC数据源输出PDF报表

坐标

  1. <dependency>
  2. <groupId>net.sf.jasperreports</groupId>
  3. <artifactId>jasperreports</artifactId>
  4. <version>6.8.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>junit</groupId>
  8. <artifactId>junit</artifactId>
  9. <version>4.12</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. <version>5.1.47</version>
  15. </dependency>

把模板放到指定目录 编写java类

  1. @Test
  2. public void testReport_JDBC() throws Exception{
  3. Class.forName("com.mysql.jdbc.Driver");
  4. Connection connection =
  5. DriverManager.getConnection("jdbc:mysql://localhost:3306/health",
  6. "root",
  7. "123456");
  8. String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jrxml";
  9. String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jasper";
  10. //编译模板
  11. JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
  12. //构造数据
  13. Map paramters = new HashMap();
  14. paramters.put("company","传智播客");
  15. //填充数据---使用JDBC数据源方式填充
  16. JasperPrint jasperPrint =
  17. JasperFillManager.fillReport(jasperPath,
  18. paramters,
  19. connection);
  20. //输出文件
  21. String pdfPath = "D:\\test.pdf";
  22. JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
  23. }

中文乱码问题:在Jaspersoft Studio中打开demo1.jrxml文件,选中中文相关元素,统一将字体设置为“华文宋体”并将修改后的demo1.jrxml重新复制到maven工程中 并将字体库放到同目录下

在同级字体目录创建fonts.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <fontFamilies>
  3. <fontFamily name="华文宋体">
  4. <normal>stsong/stsong.ttf</normal>
  5. <bold>stsong/stsong.ttf</bold>
  6. <italic>stsong/stsong.ttf</italic>
  7. <boldItalic>stsong/stsong.ttf</boldItalic>
  8. <pdfEncoding>Identity-H</pdfEncoding>
  9. <pdfEmbedded>true</pdfEmbedded>
  10. <exportFonts>
  11. <export key="net.sf.jasperreports.html">'华文宋体',Arial,Helvetica,sans-serif</export>
  12. <export key="net.sf.jasperreports.xhtml">'华文宋体',Arial,Helvetica,sans-serif</export>
  13. </exportFonts>
  14. </fontFamily>
  15. </fontFamilies>

然后在resources 创建 jasperreports_extension.properties 文件

  1. net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
  2. net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml

5.4. Bean数据库输出PDF

与上面基本一致但类中使用的构造方法参数不一致

  1. @Test
  2. public void testReport_JavaBean() throws Exception{
  3. String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jrxml";
  4. String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jasper";
  5. //编译模板
  6. JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
  7. //构造数据
  8. Map paramters = new HashMap();
  9. paramters.put("company","传智播客");
  10. List<Map> list = new ArrayList();
  11. Map map1 = new HashMap();
  12. map1.put("tName","入职体检套餐");
  13. map1.put("tCode","RZTJ");
  14. map1.put("tAge","18-60");
  15. map1.put("tPrice","500");
  16. Map map2 = new HashMap();
  17. map2.put("tName","阳光爸妈老年健康体检");
  18. map2.put("tCode","YGBM");
  19. map2.put("tAge","55-60");
  20. map2.put("tPrice","500");
  21. list.add(map1);
  22. list.add(map2);
  23. //填充数据---使用JavaBean数据源方式填充
  24. JasperPrint jasperPrint =
  25. JasperFillManager.fillReport(jasperPath,
  26. paramters,
  27. new JRBeanCollectionDataSource(list));
  28. //输出文件
  29. String pdfPath = "D:\\test.pdf";
  30. JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
  31. }