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>
View Code

 

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();
    }
}
View Code
中文处理
    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
View Code
指定中文配置文件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>
View Code
引入字体库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();
        }
    }
}
View Code

 后续

JasperReport 数据填充参考 :https://blog.csdn.net/weixin_42528266/article/details/103769077
  
我的项目地址:https://gitee.com/richOne/java_poi_operation_example
 
posted @ 2020-02-02 23:24  Angry-rookie  阅读(197)  评论(0)    收藏  举报