Springboot 集成JasperReport 6.7 及中文显示不出来问题解决

概述:

JasperReport作为java报表生成工具,还是具有很多优点的,当然相比于其他收费报表工具,JasperReport最主要的优点是开源免费,下面介绍下如何用JasperReport生成一个pdf文档

步骤:

1、生成JasperReport模板:

我这里使用的是JasperReport Studio工具,原来用的iReport在几年前已经停止更新了。

下载地址:

https://community.jaspersoft.com/project/jaspersoft-studio

进行安装后,可以新建一个工程,然后新建Jasper Report模板:

工程结构如下:

这里的report1.jrxml是我刚新建的jasper report模板

这时我们可以在工作区编缉这个模板:

这里我简单的拖动了两个控件,一种是StaticText,另一种是Text Field控件。

其中Text Filed中的$F{NAME}, $F{INFO} 可以通过如下方式设置,一会代码中有用:

分别取名为NAME和INFO:

做到这里,一个简单的Jasper Report模板文件生成好了

注意:

1、Jasper Report可以直接设置数据库来源,我这里没做设置,通过在代码中指定数据的形式集成

关于中文设置,这里我们设置的Static Text是有中文的,我分别设置了宋体  和  其他字段,如下:

2、代码集成:

jasper需要的pom.xml如下:

<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
<dependency>
	<groupId>net.sf.jasperreports</groupId>
	<artifactId>jasperreports</artifactId>
	<version>6.7.0</version>
</dependency>

<dependency>
	<groupId>com.lowagie</groupId>
	<artifactId>itext</artifactId>
	<version>2.1.7</version>
</dependency>

注意这里的itext 2.1.7,在jasperreports中itext-2.1.7.js6一直集成失败

pom配置好后,需要集成一下report环境:

把刚才jasper studio保存的report,放到web工程的resource目录下,我的目录结构如下:

注意这里的路径哦

 

接下来就是写代码了:

首先写一个bean,用于刚才jasper studio中report模板中的 text field,具体如下:

public class Student {
    private String NAME;
    private String INFO;

    public Student() {
    }

    public Student(String NAME, String INFO) {
        this.NAME = NAME;
        this.INFO = INFO;
    }

    public String getNAME() {
        return NAME;
    }

    public void setNAME(String NAME) {
        this.NAME = NAME;
    }

    public String getINFO() {
        return INFO;
    }

    public void setINFO(String INFO) {
        this.INFO = INFO;
    }
}

注意这里的名字,跟刚才定义的Field名字一样。

定义一个Service,用于生成pdf报表:

@Service
public class ReportService {
    public byte[] getReportPdf(final JasperPrint jp) throws JRException{
        return JasperExportManager.exportReportToPdf(jp);
    }
}

定义一个Controller,用于访问及返回,当然因为只是一个Demo,所以把report的初始化、配置之类的代码都放在了一起:

@RestController
public class TestController {
    @Autowired
    private ReportService reportService;

    @GetMapping("pdfdata")
    public HttpEntity<byte[]> downloadPdf() throws JRException{
        Student student = new Student("Jack", "China");
        List<Student> list = new ArrayList<>();
        list.add(student);
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
        String filename = "d:\\report1.jasper";

        File compiledFile = new File(filename);
        JasperReport jr;
        if (compiledFile.exists()){
            jr = (JasperReport) JRLoader.loadObject(compiledFile);
        }else{
            InputStream inputStream = getClass().getResourceAsStream("/jasper/report1.jrxml");
            JasperDesign jd = JRXmlLoader.load(inputStream);
            jr = (JasperCompileManager.compileReport(jd));
            JRSaver.saveObject(jr, filename);
        }

        JasperPrint jasperPrint = JasperFillManager.fillReport(jr, new HashMap<>(), dataSource);
        final byte[] data = reportService.getReportPdf(jasperPrint);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PDF);
        headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline: filename=demo.pdf");
        headers.setContentLength(data.length);
        return new HttpEntity<>(data, headers);
    }
}

这样就集成了一个能生成Jasper报表的web工程了,运行,输入http://localhost:8080/pdftest,查看结果如下:

可以发现值已经设置上去了,但是这里面没有中文

 

Jasper Report中文问题解决:

网上找了一圈,有各种方法 都试验了一下,发现可行性不高

1、集成itext-asian jar包,发现在jasper report 6.7版本中已经没用了

2、修改jasper report的fonts jar包,这个感觉就算了,工程是用Maven管理的,没必要搞的这么复杂

 

我这里的方法是,把字体文件 跟设置结合,具体操作如下:

刚才我们在jasper studio设置了一些字体,有华文宋体跟其他字体,我们可以在c:\windows\fonts中找到华文宋体

这个字体名为STSONT.TTF

把这个字体文件拷贝到web工程中,并且设置字体信息:

目录结构如下:

其中fonts.xml的配置信息如下,这个文件指定了字体信息:

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

<fontFamilies>
    <fontFamily name="msyh"><!--字体名称-->
        <normal>fonts/STSONG.TTF</normal><!--字体文件的路径-->
        <bold>fonts/STSONG.TTF</bold>
        <italic>fonts/STSONG.TTF</italic>
        <boldItalic>fonts/STSONG.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>

另外再新建一个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

这样字体信息在web工程的配置就完成了,可以再次运行,结果如下:

 

这时我们可以看到 设置为华文宋体的控件已经能显示出中文了,没有设置华文宋体的还是没有显示出中文

Spring Boot可以很方便地整合JasperReport,以下是整合步骤: 1. 添加依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.17.0</version> </dependency> ``` 2. 配置JasperReport 在application.properties文件中添加以下配置: ``` # JasperReport配置 jasperreport.compile.on.first.use=true jasperreport.cache.directory=./jasperreport_cache ``` 3. 编写Controller 编写Controller,使用JasperReport生成报表并返回给前端。 ``` @RestController public class ReportController { @GetMapping("/report") public void generateReport(HttpServletResponse response) throws Exception { // 获取JasperReport模板文件 InputStream jasperStream = this.getClass().getResourceAsStream("/reports/report.jasper"); // 设置参数 Map<String, Object> params = new HashMap<>(); params.put("title", "报表标题"); // 获取数据源 List<ReportData> data = getData(); JRDataSource dataSource = new JRBeanCollectionDataSource(data); // 编译JasperReport模板文件 JasperReport jasperReport = JasperCompileManager.compileReport(jasperStream); // 填充JasperReport模板文件 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource); // 导出报表 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "inline; filename=report.pdf"); final OutputStream outputStream = response.getOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream); } private List<ReportData> getData() { // 获取数据源 // ... } } ``` 4. 编写JasperReport模板文件 在resources目录下创建reports目录,并在该目录下创建report.jrxml文件,编写JasperReport模板文件。 5. 运行程序 运行程序,访问http://localhost:8080/report,即可生成报表并在浏览器中显示
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值