PDF操作
目前世面上比较流行的制作PDF报表的工具如下:
1. iText PDF:iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf
的文档,而且可以将XML、Html文件转化为PDF文件。
2. Openoffiffiffice:openoffiffiffice是开源软件且能在windows和linux平台下运行,可以灵活的将word或者Excel转化
为PDF文档。
3. Jasper Report:是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF
JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者
XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。只需
要将JasperReport引入工程中即可完成PDF报表的编译、显示、输出等工作。
在开源的JAVA报表工具中,JASPER Report发展是比较好的,比一些商业的报表引擎做得还好,如支持了十字
交叉报表、统计报表、图形报表,支持多种报表格式的输出,如PDF、RTF、XML、CSV、XHTML、TEXT、
DOCX以及OpenOffiffiffice。
数据源支持更多,常用 JDBC SQL查询、XML文件、CSV文件 、HQL(Hibernate查询),HBase,JAVA集合
等。还允许你义自己的数据源,通过JASPER文件及数据源,JASPER就能生成最终用户想要的文档格式。
在JasperReports中,这只是报表生命周期
的最后阶段。通过JasperReports生成PDF报表一共要经过三个阶段,我们称之为 JasperReport的生命周期,这三
个阶段为:设计(Design)阶段、执行(Execution)阶段以及输出(Export)阶段
1. JRXML:报表填充模板,本质是一个XML.
JasperReport已经封装了一个dtd,只要按照规定的格式写这个xml文件,那么jasperReport就可以将其解析
最终生成报表,但是jasperReport所解析的不是我们常见的.xml文件,而是.jrxml文件,其实跟xml是一样
的,只是后缀不一样。
2. Jasper:由JRXML模板编译生成的二进制文件,用于代码填充数据。
解析完成后JasperReport就开始编译.jrxml文件,将其编译成.jasper文件,因为JasperReport只可以
对.jasper文件进行填充数据和转换,这步操作就跟我们java中将java文件编译成class文件是一样的
3. Jrprint:当用数据填充完Jasper后生成的文件,用于输出报表。
这一步才是JasperReport的核心所在,它会根据你在xml里面写好的查询语句来查询指定是数据库,也可以控
制在后台编写查询语句,参数,数据库。在报表填充完后,会再生成一个.jrprint格式的文件(读取jasper文
件进行填充,然后生成一个jrprint文件)
4. Exporter:决定要输出的报表为何种格式,报表输出的管理类。
5. Jasperreport可以输出多种格式的报表文件,常见的有Html,PDF,xls等
开发流程
1.先用模板工具Jaspersoft Studio 设计JRXML 模板然后编译为Jasper 文件。
2.SpringBoot 再根据Jasper文件进行数据填充然后输出。
依赖
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.5.0</version>
</dependency>
<dependency>
<groupId>org.olap4j</groupId>
<artifactId>olap4j</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
controller
package com.zhao.jasperreport; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; /** * web端导出 通过 jaspersoft-studio工具已经编译好的jasper的文件模板 生成 pdf */ @RestController public class jasperController { @GetMapping("exportPDF") public void exportPDF(HttpServletRequest request ,HttpServletResponse response) throws Exception { //1.引入 jasper 文件 Resource resource=new ClassPathResource("template-pdf/zhaoPDF.jasper"); FileInputStream fis=new FileInputStream(resource.getFile()); //2.创建jasper 文件 向获取到的模板jasper文件填充数据 //new JREmptyDataSource() 不写的话 输出的pdf永远都为空 /** * fis 文件输入流 * new HashMap<>() 向模板中输入的 参数 * new JREmptyDataSource() 数据源 和数据库中的数据源不同 填充模板的数据来源(connection jAVAbean map) * 没有数据源 填充空的数据源 JREmptyDataSource */ JasperPrint print = JasperFillManager.fillReport(fis, new HashMap<>(), new JREmptyDataSource()); //3.将jasper 以pdf的形式输出 /** * 参数 0 jasperPrint * 1 输出流 */ ServletOutputStream outputStream = response.getOutputStream(); JasperExportManager.exportReportToPdfStream(print,outputStream); outputStream.flush(); } @GetMapping("exportPDFH") public void exportPDFH(HttpServletRequest request ,HttpServletResponse response) throws Exception { //参考 :https://blog.csdn.net/weixin_42528266/article/details/103769077 //1.引入 jasper 文件 Resource resource=new ClassPathResource("template-pdf/zhaoPDF1.jasper"); FileInputStream fis=new FileInputStream(resource.getFile()); //2.创建jasper 文件 向获取到的模板jasper文件填充数据 //new JREmptyDataSource() 不写的话 输出的pdf永远都为空 /** * fis 文件输入流 * new HashMap<>() 向模板中输入的 参数 * new JREmptyDataSource() 数据源 和数据库中的数据源不同 填充模板的数据来源(connection jAVAbean map) * 没有数据源 填充空的数据源 JREmptyDataSource */ Map parame = new HashMap<>(); //设置参数 参数的key = 模板中使用的parameters参数的name parame.put("name","Map填充数据"); parame.put("password","10086"); JasperPrint print = JasperFillManager.fillReport(fis, parame, new JREmptyDataSource()); //3.将jasper 以pdf的形式输出 /** * 参数 0 jasperPrint * 1 输出流 */ ServletOutputStream outputStream = response.getOutputStream(); JasperExportManager.exportReportToPdfStream(print,outputStream); outputStream.flush(); } }
中文处理
1.设计阶段就把对应的文字设计为华文宋体
2.添加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
指定中文配置文件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>
引入字体库stsong.TTF
pc端模拟
JasperReport
pdf创建
package com.zhao.jasperreport.demo; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.view.JasperViewer; import java.util.HashMap; /** * 利用 jasperReport 工具生成 pdf */ public class jasperReportPdfBuild { public static void main(String[] args) { createJasper(); // createJrprint(); // showPdf(); } //1.将pdf模板编译为Jasper文件 public static void createJasper(){ try{ String path = "D:\\projectCode\\poiUtils\\java-poi\\src\\main\\java\\com\\zhao\\jasperreport\\demo\\Design.jrxml"; JasperCompileManager.compileReportToFile(path); }catch(Exception e){ e.printStackTrace(); } } //2.将Jasper文件 和数据进行填充 或Jrprint public static void createJrprint(){ try{ String path = "D:\\projectCode\\poiUtils\\java-poi\\src\\main\\java\\com\\zhao\\jasperreport\\demo\\JsPDF.jasper"; //通过空参数和空数据源进行填充 JasperFillManager.fillReportToFile(path,new HashMap(),new JREmptyDataSource()); }catch(Exception e){ e.printStackTrace(); } } //3.预览 public static void showPdf(){ try{ String path = "D:\\projectCode\\poiUtils\\java-poi\\src\\main\\java\\com\\zhao\\jasperreport\\demo\\JsPDF.jrprint"; JasperViewer.viewReport(path,false); }catch(Exception e){ e.printStackTrace(); } } }
后续
JasperReport 数据填充参考 :https://blog.csdn.net/weixin_42528266/article/details/103769077
我的项目地址:https://gitee.com/richOne/java_poi_operation_example

浙公网安备 33010602011771号