PDF技术之-jasperreports的使用

使用过程中会出现中文没有显示的问题。

解决方法:

在设置jasper文件的过程中设置其中的中文的字体。我选择的是华文宋体。

设置好字段的中文的字体样式。就把这个jasper文件放到我的springboot项目中。

我项目的格式为:

 这里有从网上找到的stsong.TTF为华文宋体的样式。自己配置的fonts.xml字体配置。

其中

fonts.xml配置为:

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
      <!--<fontFamily name="Lobster Two">-->
      <!--<normal>lobstertwo/LobsterTwo-Regular.otf</normal>-->
      <!--<bold>lobstertwo/LobsterTwo-Bold.otf</bold>-->
      <!--<italic>lobstertwo/LobsterTwo-Italic.otf</italic>-->
      <!--<boldItalic>lobstertwo/LobsterTwo-BoldItalic.otf</boldItalic>-->
      <!--<pdfEncoding>Identity-H</pdfEncoding>-->
      <!--<pdfEmbedded>true</pdfEmbedded>-->
      <!--<!–-->
      <!--<exportFonts>-->
      <!--<export key="net.sf.jasperreports.html">'Lobster Two', 'Times New Roman',
Times, serif</export>-->
      <!--</exportFonts>-->
      <!--–>-->
      <!--</fontFamily>-->
      
    <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>
        <!--<locales>
              <locale>en_US</locale>
              <locale>de_DE</locale>
            </locales>
         -->
          
    </fontFamily>
</fontFamilies>

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

java的代码:

 传入parameters值的时候,在设置jasper文件的parameters的值就是使用map传入对应的值的。这里不是filed的,第三个参数才是表格字段filed的。

@RequestMapping(value = "/testJaper01", method = RequestMethod.GET)
    public void createHtml(HttpServletResponse response, HttpServletRequest request) throws IOException {
        //引入jasper文件
        ClassPathResource resource = new ClassPathResource("templates/parameters.jasper");
        FileInputStream fis = new FileInputStream(resource.getFile());
        ServletOutputStream outputStream = response.getOutputStream();
        //模板的参数名称和Map的key一致的
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("id", "111");
        map.put("username", "zs张三");
        map.put("companyName", "caicai公司");
        map.put("mobile", "15222222222");
        try {
            //这个map设置的就是parameters的值,并非是filed的
            JasperPrint print = JasperFillManager.fillReport(fis, map, new JREmptyDataSource());
            /*导出PDF*/
            JasperExportManager.exportReportToPdfStream(print, response.getOutputStream());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            outputStream.flush();
            outputStream.close();
            fis.close();
        }
    }

使用jdbc连接数据库拿到数组渲染到表格

@GetMapping("/testJaper02")
    public void createPDF(HttpServletResponse response, HttpServletRequest request) throws IOException {
        //1.引入文件
        ClassPathResource resource = new ClassPathResource("templates/testjdbc.jasper");
        FileInputStream fileInputStream = new FileInputStream(resource.getFile());
        //2.创建jasperPrint,向jasper文件中填充数据
        ServletOutputStream outputStream = response.getOutputStream();
        try {
            //这里由于是使用到了jdbc直接连接上数据库,所有这个map不存入任何值。
            HashMap<String, Object> parameters = new HashMap<String, Object>();
            JasperPrint print = JasperFillManager.fillReport(fileInputStream, parameters, getConnection());
            //3.将jasperPrint以PDF的形式输出
            JasperExportManager.exportReportToPdfStream(print, outputStream);
            // response.setContentType("application/pdf");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            outputStream.flush();
            outputStream.close();
            fileInputStream.close();
        }
    }

    public Connection getConnection() {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/ssm";
            connection = DriverManager.getConnection(url, "root", "root");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

使用javabean来渲染数据

 @GetMapping("/testjavaBean")
    public void createPDF2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ClassPathResource resource = new ClassPathResource("templates/testJavaBean.jasper");
        FileInputStream fis = new FileInputStream(resource.getFile());
        ServletOutputStream os = response.getOutputStream();
        try {
            HashMap<String, Object> map = new HashMap<String, Object>();
           /* ArrayList<User> arrayList = new ArrayList<User>(10);
            for (int i = 0; i < 10; i++) {
                User user = new User(i, "m00" + i, "小" + i, "别名" + i, "pic" + i, "状态" + i);
                arrayList.add(user);
            }*/
            List<User> arrayList = userService.findAllUser();
            JRBeanCollectionDataSource ds= new JRBeanCollectionDataSource(arrayList);
            /**1.jasper文件流
             * 2.参数列表
             * 3.JRBeanCollectionDataSource*/
            JasperPrint jasperPrint = JasperFillManager.fillReport(fis, map, ds);
            JasperExportManager.exportReportToPdfStream(jasperPrint,os);
            response.setContentType("application/pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            os.flush();
        }


    }

在返回给前端的问题:

一种是以pdf文件显示或者导出

在浏览器显示的输出配置;

/** * 参数一:封装好模板好数据的JasperPrint对象 * 参数二:输出的位置 */
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());

下载的配置

/** 参数:封装好模板好数据的JasperPrint对象
* 参数二:输出的位置*/

//设置下载框响应头
response.setHeader("Content-Disposition","attachment;filename=export.pdf");  //参数一是响应头,参数而,是附件和下载后的文件名
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());  //这一步同上

https://wenku.baidu.com/link?url=HrWPdhA-kf-dCDnoak9kfYaB7PzoYj1foufQ0kYPfVEcte6s5qkTh5ENhqDZhnknzVKwMqdzRMKZyagPYlnwdXgTt7fS_aSmPA4FLiZoqEC

原文地址:https://www.cnblogs.com/fengyangcai/p/14521662.html