一.iReport安装与使用
1.下载安装iReport(5.6.0)
下载地址(社区地址需要): https://community.jaspersoft.com/project/ireport-designer/releases
下载地址(csdn下载): https://download.csdn.net/download/csdndemimang/12766669
2.使用介绍
2.1安装完成之后,运行程序
2.2创建模板 文件 --> new ,后面全部点下一步
3.3模板制作(注意要把所有包含中文的设置成宋体,不然中文不显示)
3.4创建完成,点击preview,进行预览, 点击小锤子生成jasper文件(代码生成pdf的时候用,文件和创建模板文件在一个目录)
二.代码部分,生成pdf
1.添加相关依赖
<dependency>
<groupId>net.sourceforge.javydreamercsw</groupId>
<artifactId>JasperReport</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.5.7</version>
</dependency>
<dependency>
<groupId>cn.lesper</groupId>
<artifactId>iTextAsian</artifactId>
<version>3.0</version>
</dependency>
2.在项目根目录添加jasperreports_extension.properties文件
###通过iReport生成的pdf模板生成pdf的相关配置
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml
# barcode4j 生成图片格式默认为svg,改用普通图片格式
net.sf.jasperreports.components.barcode4j.image.producer=image
# 图片dpi,默认值为72,Lodop打印使用的是96px,因此需要覆盖
net.sf.jasperreports.image.dpi=96
# HTML单位长度单位,默认为px,由于jasperReports的像素是按照1dpi=72px设计,和Lodop打印插件冲突,此处改为1dpi=72pt即可和Lodop的单位换算一致
net.sf.jasperreports.export.html.size.unit=pt
net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR=true
net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN=false
net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS=true
3.项目根目录创建fonts文件夹,放入字体文件(解决中文不显示)
文件地址: https://download.csdn.net/download/csdndemimang/12767731
4.写代码进行测试(代码中的jasper文件替换成自己生成的)
public static void main(String[] args) {
HashMap<String, Object> map = new HashMap<>();
map.put("str1", "动态文本");
ArrayList<Object> objects = new ArrayList<>();
HashMap<String, Object> item = new HashMap<>();
item.put("name", "张三");
item.put("sex", "男");
item.put("age", "11");
objects.add(item);
item = new HashMap<>();
item.put("name", "李四");
item.put("sex", "女");
item.put("age", "12");
objects.add(item);
item = new HashMap<>();
item.put("name", "李四");
item.put("sex", "女");
item.put("age", "12");
objects.add(item);
OutputStream output = null;
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
List<JasperPrint> jsperList = new ArrayList<JasperPrint>();
try{
//模板文件流
File reportFile = new File("D:\\tmp\\jasperreports\\report1.jasper");
//数据源
JRDataSource dataSource = new JRBeanCollectionDataSource(objects);
//构造jasper文件 此处使用同一个jasper模板,如果你有其它的模板也可以拼凑
JasperReport jasper = (JasperReport) JRLoader.loadObject(reportFile);
//用数据填充jasperreport文件
JasperPrint jasperPrint = JasperFillManager.fillReport(jasper, map, dataSource);
jsperList.add(jasperPrint);
//将生成文件流,到byteout
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jsperList);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, byteOut);
exporter.exportReport();
//创建pdf文件,写入流
File pdfFile = new File("D:\\tmp\\test.pdf");
output = new FileOutputStream(pdfFile);
output.write(byteOut.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
output.close();
byteOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.执行成功
附加:图片
如果模板需要包含图片,
1.拖一个图片到模板,(如果是静态的,拖的时候会让你选地址,直接选择就可以了)
2.如果是动态的(不用选地址直接下一步),选中图片点击右上角的属性
3.修改上图的属性为
new java.io.ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($P{imgStr}.getBytes()))
4.然后后台传base64字符串就行
//图片转字符串
/*File file = new File("D:\\tmp\\img\\170f3d215630fa69795af44a0b67481.jpg");
FileInputStream in = new FileInputStream(file);
byte[] b = new byte[in.available()];
//将流转二进制
in.read(b);
Encoder encoder = Base64.getEncoder();
//将二进制文件转base64字符串
String imgStr = encoder.encodeToString(b);*/
map.put("imgStr", imgStr);