PDF生成
# PDF 生成
# iText
iText 是著名的开放源码的站点 sourceforge 一个项目,是用于生成 PDF 文档的一个 java 类库
坐标
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
2
3
4
5
package com.itheima.app;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class ItextDemo {
public static void main(String[] args) {
try {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:\\test.pdf"));
document.open();
document.add(new Paragraph("hello itext"));
document.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# JasperReports
JasperReports 是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成 PDF,HTML,或者 XML 格式。该库完全由 Java 写成,可以用于在各种 Java 应用程序,包括 J2EE,Web 应用程序中生成动态内容。一般情况下,JasperReports 会结合 Jaspersoft Studio (模板设计器) 使用导出 PDF 报表。
坐标
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.8.0</version>
</dependency>
2
3
4
5
将 jrxml 文件 复制到 resource 目录下
编写 java 类
@Test
public void testJasperReports()throws Exception{
String jrxmlPath =
"D:\\ideaProjects\\projects111\\jasperdemo\\src\\main\\resources\\demo.jrxml";
String jasperPath =
"D:\\ideaProjects\\projects111\\jasperdemo\\src\\main\\resources\\demo.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
Map paramters = new HashMap();
paramters.put("reportDate","2019-10-10");
paramters.put("company","itcast");
List<Map> list = new ArrayList();
Map map1 = new HashMap();
map1.put("name","xiaoming");
map1.put("address","beijing");
map1.put("email","[email protected]");
Map map2 = new HashMap();
map2.put("name","xiaoli");
map2.put("address","nanjing");
map2.put("email","[email protected]");
list.add(map1);
list.add(map2);
//填充数据
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperPath,
paramters,
new JRBeanCollectionDataSource(list));
//输出文件
String pdfPath = "D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# JasperReports 原理

- JRXML:报表填充模板,本质是一个 xml 文件
- Jasper:由 JRXML 模板编译成的二进制文件,用于代码填充数据
- Jrprint:当用数据填充完 Jasper 后生成的对象,用于输出报表
- Exporter:报表输出的管理类,可以指定要输出的报表为何种格式
- PDF/HTML/XML:报表形式
# 模板设计器 Jaspersoft Studio
Jaspersoft Studio 是一个图形化的报表设计工具,可以非常方便的设计出 PDF 报表模板文件 (其实就是一个 xml 文件),再结合 JasperReports 使用,就可以渲染出 PDF 文件。
下载地址:https://community.jaspersoft.com/community-download
创建新的项目

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

在 Parameters 上点击右键,创建一个 Parameter 参数 以 key value 形式
# JDBC 数据源数据填充

右键 data adapters 创建新的数据源


选择 mysql 驱动

并且添加驱动 jar 包
在 Outline 视图中,右键点击工程名,选择 Database and Query 菜单

切换数据源

添加列名

查询后的字段在 Fields 中

# JavaBean 数据源数据填充
在 Fields 处点击右键创建新的 Field

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

使用此种 JavaBean 数据源数据填充方式,无法正常进行预览,因为这些动态 Fields 需要在 Java 程序中动态进行数据填充。
# JDBC 数据源输出 PDF 报表
坐标
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.8.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
把模板放到指定目录 编写 java 类
@Test
public void testReport_JDBC() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/health",
"root",
"123456");
String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jrxml";
String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
Map paramters = new HashMap();
paramters.put("company","传智播客");
//填充数据---使用JDBC数据源方式填充
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperPath,
paramters,
connection);
//输出文件
String pdfPath = "D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
中文乱码问题:在 Jaspersoft Studio 中打开 demo1.jrxml 文件,选中中文相关元素,统一将字体设置为 “华文宋体” 并将修改后的 demo1.jrxml 重新复制到 maven 工程中 并将字体库放到同目录下
在同级字体目录创建 fonts.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="华文宋体">
<normal>stsong/stsong.ttf</normal>
<bold>stsong/stsong.ttf</bold>
<italic>stsong/stsong.ttf</italic>
<boldItalic>stsong/stsong.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'华文宋体',Arial,Helvetica,sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'华文宋体',Arial,Helvetica,sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
然后在 resources 创建 jasperreports_extension.properties 文件
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml
2
# Bean 数据库输出 PDF
与上面基本一致但类中使用的构造方法参数不一致
@Test
public void testReport_JavaBean() throws Exception{
String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jrxml";
String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
Map paramters = new HashMap();
paramters.put("company","传智播客");
List<Map> list = new ArrayList();
Map map1 = new HashMap();
map1.put("tName","入职体检套餐");
map1.put("tCode","RZTJ");
map1.put("tAge","18-60");
map1.put("tPrice","500");
Map map2 = new HashMap();
map2.put("tName","阳光爸妈老年健康体检");
map2.put("tCode","YGBM");
map2.put("tAge","55-60");
map2.put("tPrice","500");
list.add(map1);
list.add(map2);
//填充数据---使用JavaBean数据源方式填充
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperPath,
paramters,
new JRBeanCollectionDataSource(list));
//输出文件
String pdfPath = "D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36