问题背景:
上周五,项目经理和技术组长讨论一个关于用ireport开发的打印功能,原因是这个打印上有四部分,但是每次打印总是有几部分的数据有错位现象发生,运维人员在上海市某院调了好几天打印机,也无法解决这个问题,于是将这个问题反馈到开发,寻求帮助。在他们讨论的过程中,我也被叫去参与讨论分析,主要是想实现人工干预,进行打印中部分模块的微调(因为我在我们组打印做的比较多,可以说是打印功能经验丰富,所以我才被叫去讨论)。原有的模块如下图所示:
整个打印出来的4A纸,有四个模块,其中最右侧两个模块的内容总是偏上或者偏下,形成错位,因为涉及到police,所以这张纸输出规范要求很严,否则会被对方拒收。
需要解决的问题:
通过人工干预,实现动态控制这张纸上的部分模块微调。
实现思路:
经过讨论,我觉得应该可以实现,当然是处于我对打印控件ireport的认识和理解层面,于是我提出,可以做一个demo,试一下,如果可以实现,那么就可以解决这个问题。
关于ireport打印,在网上的资料真的是少之又少,基本很少能搜到相关有用的信息。之所以对ireport熟悉,是因为之前也要做一个套打的功能,类似于医院打印收费单,把打印好的纸张塞进去,在相应的地方打印出相应的值(我把它称为套打功能)。
ireport打印原理:
IReport打印,就是通过绘制一张模板,使用ireport软件,然后,通过后台将数据库查询出来的结果集,作为打印的数据源,在后台设置打印的域,来填充绘制的模板,最后设置导出打印模板PDF就可以了。
针对上面那个动态控制局部大小功能实现:
- 用ireport画一张空白模板,所以此时你应该设置了空白模板的大小,长度和宽度。
- 不在空白模板中添加任何组件,比如textfield、staticText等
- 我们通过自己手动在后台中用代码绘制控件,并给控件赋值的方式,来给空白模板添加控件。
ireport模板上的内容就是一个对象,只是每个值就是该对象的一个属性。
还有一种就是,ireport中所有的数据都公用一个模板,然后打印的结果是多个相同的对象,但是我们的数据结果集只需要封装为list就可以。
具体实现代码如下所示:
首先我建了一个实体:
package com.***.web;
public class Person {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
然后新建了一个controller:
package com.***.web;
import com.***.utils.RequestUtils;
import jav