JAVA调用IReport模板生成PDF文件及常见的几个问题解决

转载:http://cache.baiducontent.com/c?m=v14RCBGrkK42yz2FeanXqBoajYiAJ_4DRfR4Nf4hLHBWypeB9bh7NcTa1kmpVXg4BJ3p8xYUEVVoCpe4uaQyv7Bg_Ve0PgPHceNv6yNBw8uuwZ0LI9qiNQSdHZtCFqlfK5ZAweI7EciLEB12Pc6cxKuL3Zab9LlzThf9CQucpzarnXAQLFecPUZlHP7hV1GLz5yzQ2m8Fg-nN_m27I_3ba&p=9c638915d9c040a92ab98c2d02148d&newp=8a6ec54ad5c247b70be2966d5c55cf231610db2151d6d4176b82c825d7331b001c3bbfb423291406d8c57d6c00a94a5eebf63777370923a3dda5c91d9fb4c5747990&s=747d392acfc03cab&user=baidu&fm=sc&query=ireport%C4%A3%B0%E5%C9%FA%B3%C9PDF%CE%C4%BC%FE&qid=c3cbbf4a0009d9ab&p1=2

先生成一个空白模板
在这里插入图片描述

然后先不要急着拼组件,先来大致了解一下这个工具的使用方法和模板的构造
在这里插入图片描述
title:只在报表的第一页显示,后面的就不在显示,常用来放置报表名称。
page header :相当于页眉,在第一页位于title的下面,而后的页中是位于最上部。
page footer :相当于页脚,和page header是想对应的。
detail :报表内容显示的部分,这部分内容是重复的,相当于迭代的过程,常用于放置类似表格中列的内容。
column header :针对Detail Band 的表头段,一般情况下在这个段中画报表的表头,用于放置表头内容
column footer :和column header 相对的。
summary :出现在整个报表的最后一页的detail的下面,统计总值结果。

下面下来做个测试,了解一下这个模板的各个位置,首先把各个构件的高度都调到最高,让这个页面放到最大,如果不放大的话,所有的构件都在同一页上了,看不出来效果,现在我把每个构件的中间都放了一个staticText,写上他们的名字,再把背景图也加上,看下效果,
在这里插入图片描述
在这里插入图片描述

如果你不知道背景图怎么展开,先点一下构件的名字,然后把属性高度调到最高,也就是802,你就可以看到他了,然后再从组件里拖一个image过来,放一个图片就OK了
在这里插入图片描述

然后准备就绪,编译一把,看看效果

共有三页,
第一页:
在这里插入图片描述
第二页
在这里插入图片描述
第三页:
在这里插入图片描述

然后可以总结下,这个title是只在第一页会有,summary是只在最后一页会有,背景图是每一页都有,detail除了第一页和最后一页都有,其他的组件都是除了最后一页都有,然后知道了这些以后就可以按照自己的需求去写这个页面了。

主要就是有个list的遍历循环,我等会儿再写。

list的循环,这里要结合java代码给塞数据

先来看一下塞一个变量怎么塞:
在这里插入图片描述
点击效果预览,会提示让你输入这个参数内容
在这里插入图片描述
然后就看到了这个参数了
在这里插入图片描述

下面我们来看list是怎么搞的。
先建一个list属性的参数,记得已定要改为list格式
在这里插入图片描述
然后在dataset1中添加参数和刚才的名称一致
在这里插入图片描述
在这里插入图片描述

然后生成jasper文件模板以后我用java代码调用一下看看

稍等会儿再写,,

java调用jasper文件demo

使用到的包:
在这里插入图片描述

<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<!-- 生成pdf所依赖的包 -->
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--将.jrxml编译成.jasper.如果你不使用java编译,而使用ireport工具编译则无须导入该 包 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.13</version>
</dependency>


package com.lin.study.test;

import com.lin.study.utils.JasperHelper;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JasperTest {

    public static void main(String[] args) throws Exception {

        JRDataSource jrDataSource = new JRBeanCollectionDataSource(null);//这个应该是给Jasper转化List的作用
        Map testMap=new HashMap();

        List<BenzBean> list = new ArrayList<BenzBean>();
        BenzBean bean1 = new BenzBean();
        bean1.setBenzListParamName("C100");

        BenzBean bean2 = new BenzBean();
        bean2.setBenzListParamName("C200");

        BenzBean bean3 = new BenzBean();
        bean3.setBenzListParamName("C300");
        list.add(bean1);
        list.add(bean2);
        list.add(bean3);
        testMap.put("benzListParam",list);
        testMap.put("benzParam","我是林俊杰");
        List jasperPrintList = new ArrayList();

        File BenzIReport = new File("D:/iReport/work/jasper/BenzIReport.jasper");
        if(BenzIReport.exists()){
            JasperReport Benz = (JasperReport) JRLoader.loadObject(BenzIReport); 
            JasperPrint protocolTemplate = JasperFillManager.fillReport(Benz,testMap,jrDataSource);
            jasperPrintList.add(protocolTemplate);
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        JRPdfExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
        exporter.exportReport();
        byte[] bytes = baos.toByteArray();

        File file = new File("D:/iReport/work/benz.pdf");

        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bytes);
            System.out.println("写入成功");
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

bean对象

package com.lin.study.test;

public class BenzBean {

    private String benzListParamName;

    public String getBenzListParamName() {
        return benzListParamName;
    }

    public void setBenzListParamName(String benzListParamName) {
        this.benzListParamName = benzListParamName;
    }
}

效果如下,我给他放在titile里面展示出来了,放在Detail里面没展示出来,后面我再找找原因
在这里插入图片描述

还有这个jasper的数据连接,我之前一直用的Empty,因为我觉得这个无所谓的,我在代码里面查出来给他塞进去是一样的效果,
我这里还是补充一下吧。

如果你是Orcale数据库的话,先准备好这个jar包
链接:https://pan.baidu.com/s/1HJXvEpiuiIQSm_2E747m3g
提取码:uhzo
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后也是拖拖拽拽,这里也不多讲了

常见的问题主要有
1,空白展示为null;
在这里插入图片描述
2,文字内容太长,溢出了;
在这里插入图片描述
3,中文乱码;
在这里插入图片描述
在这里插入图片描述

net.sf.jasperreports.awt.ignore.missing.font=true

4,发布到linux服务器中文文字重叠,吃字;

吃字也是字体的问题,因为linux没有安装中文字符集,所以展示中文乱码或者计算字符长度/宽度有问题,导致文字重叠

5,生成pdf空白页问题;
在这里插入图片描述
6,commons-digester问题
代码生成pdf的时候会报错少个什么digester/Rule这个类,这是因为少了这个jar包
这个jar包我忘了从哪里搞了,我放在云盘上吧,直接拿去用得了
链接:https://pan.baidu.com/s/1JWboJzpuOu6Ff96xGJ8baA
提取码:u7ml
pom里我是这么写的

		<dependency>
			<groupId>commons-digester</groupId>
			<artifactId>commons-digester</artifactId>
			<version>2.1</version>
		</dependency>

其他的我暂时想不起来了

原文地址:https://www.cnblogs.com/lwh-12345/p/14768935.html