当前位置: 首页 > news >正文

Vue+SpringBoot:整合JasperReport作PDF报表,并解决中文不显示问题

文章目录

  • 一、前言
  • 二、后端代码
    • 1、pom依赖
    • 2、Jaspersoft Studio生成的jasper文件
    • 3、main程序测试案例
    • 4、解决中文不显示问题
    • 5、web接口案例
  • 三、Vue前端代码
  • 四、演示效果

一、前言

以前,在流行jdk1.6的时候,作pdf报表,用的软件是iReport。
在这里插入图片描述
后来,主流jdk升级到1.8后,这个,软件就停止更新了。
现在使用的是JasperReport Studio
在这里插入图片描述在这里插入图片描述

下载Jaspersoft Studio 6
链接:https://pan.baidu.com/s/1mgkRC5qnz74k8AwdOMZqYQ
提取码:cwqb

二、后端代码

1、pom依赖

网上说一大堆的依赖,其实,只需要一个即可。

        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
        </dependency>

2、Jaspersoft Studio生成的jasper文件

在这里插入图片描述

3、main程序测试案例

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;

public class Test01 {
	public static void main(String[] args) throws FileNotFoundException, JRException {
		File file = ResourceUtils.getFile("classpath:templates/test01.jasper");
		Map<String,Object> params = new HashMap<>();
		params.put("username","张三");
		params.put("email","123456@qq.com");
		JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(file), params, new JREmptyDataSource());
		JasperExportManager.exportReportToPdfFile(jasperPrint,"pdf/test01.pdf");
	}
}

4、解决中文不显示问题

创建目录:src/main/resources/fonts
创建文件:fonts.xml

<?xml version="1.0" encoding="UTF-8"?>

<fontFamilies>
    <fontFamily name="黑体"><!--字体名称-->
        <normal>fonts/simhei.ttf</normal><!--字体文件的路径-->
        <bold>fonts/simhei.ttf</bold>
        <italic>fonts/simhei.ttf</italic>
        <boldItalic>fonts/simhei.ttf</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->
        <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>

从windows的目录:C:\Windows\Fonts
中找.ttf文件格式的字体,放入fonts中
在这里插入图片描述
添加配置文件: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=fonts/fonts.xml

5、web接口案例

	@GetMapping(value = "/preview/pdf")
	public void preview(HttpServletRequest request, HttpServletResponse response) throws Exception {
//		封装参数	对应jasper report里面的filed
		Map<String,Object> params = new HashMap<>();
		params.put("username","张三");
		params.put("email","123456@qq.com");
		File file = ResourceUtils.getFile("classpath:templates/test01.jasper");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html");
		response.setContentType("application/pdf");
//		String fileName = new Date()+"测试报告.pdf";
//		设置header的这个属性,就变成了直接下载
//		response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
//		new JREmptyDataSource()  给一个空数据源,因为,params已经查询到了具体的数据。
		JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(file), params, new JREmptyDataSource());
		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
	}

三、Vue前端代码

这里需要一点axios的基本功。

      checkPdf().then(res => {
        // 将获取到的PDF文件流转换为Blob对象
        const blob = new Blob([res], { type: 'application/pdf' })
        // 创建一个URL对象
        const urlTwo = URL.createObjectURL(blob)
        // 设置PDF源为创建的URL
        window.open(urlTwo, '_blank')
      })

四、演示效果

在这里插入图片描述

相关文章:

  • 统计可重复列表中的TOP N
  • 路由工程师大纲-3:结合AI技术进行路由策略优化的知识链体系
  • P1102 A-B 数对
  • github_本地项目上传到远程
  • python 模拟登录
  • 阶跃星辰 Step-Video-TI2V 图生视频模型深度解析
  • 自由学习记录(47)
  • 10分钟读完《有限与无限的游戏》
  • 两个手机都用流量,IP地址会一样吗?深入解析
  • 【计算机网络】TCP协议技术细节全解析:与UDP的核心差异深度对比
  • 餐饮管理系统的设计与实现(代码+数据库+LW)
  • 新书速览|云原生Kubernetes自动化运维实践
  • 2024年数维杯数学建模B题生物质和煤共热解问题的研究解题全过程论文及程序
  • Linux运维篇-系统io调优
  • 《基于Python的财务数据可视化与决策支持系统开发》开题报告
  • 如何用大模型评估大模型——PAI-Judge裁判员大语言模型的实现简介
  • 2. 初识go-zero
  • Linux系统还可以在做一层虚拟化安装虚拟机吗
  • 基于Python的超导体金属研制探索与展望
  • 嵌入式c学习八
  • 男子服用头孢后饮酒应酬致昏迷在家,救援人员破门施救后脱险
  • 对话作家吉井忍:“滚石”般的生活,让我看到多种人生可能
  • 经济日报:政府采购监管篱笆要扎得更牢
  • 英国知名歌手批政府:让AI公司免费使用艺术家作品是盗窃
  • 美国考虑让移民上真人秀竞逐公民权,制片人称非现实版《饥饿游戏》
  • 流失海外79年,两卷战国帛书回归祖国