在工作中有用到Jaspersoft iReport打印组件打印PDF文档的情况,但是有时候做好的模板文件部署到服务器(本地或者远程),打印时会引起内存溢出的问题,这个时候检查方向分两条线:1)打印设值的问题 2)模板元素的问题。
首先1)打印设值的问题,要检查模板对应的字段在设值类里是否为空,是否有无限循环的可能,是否有重名,2)模板元素的问题,这个需要检查元素的属性的详细设置,比如我遇到的下面这种情况:
被保险人银行客户编号与投保人银行客户编号两个元素框挨的比较近,因为设置属性的时候考虑到被保险人银行客户编号这个值的不确定性,所以把这个元素框的属性设置为Print When Detail Overflows=true(打钩),而且Stretch With Overflow=true(打钩)
本来这样考虑也合情理,当元素内容超长时,元素框肯定显示不下,只能显示出框内的部分,所以设置超长的内容也打印出来,同时为了美观将元素框设置自动延展包容超长的内容。
Print When Detail Overflows这个设置为true倒也没有什么,顶多就是内容有可能与其他文字重叠了,但是Stretch With Overflow设置为true则会带来一个隐藏的风险,就是元素框自适应内容的超长而延展后,有可能它的定位坐标X,Y的起始位置延伸到其他元素框内部去了,原则上在同一个层面每个元素框的坐标起点与长宽限定的范围内只能表达一个元素,如果在同一层面有其他元素框的起点和边长在另一个已知元素的内部,那么在当元素框的边长设置为固定值的时候这两个元素都能显示出来,只是可能内容有重叠的部分,但是当设置元素边框Stretch With Overflow=true的时候,这个元素是一个纯动态的字段元素,而且编译的时候无法确定边长的终止范围,只能在运行的时候检测动态字段的长度来确定,那么当它延伸到其他元素范围内的时候,这个元素和其他元素该怎么确定显示的内容呢?固定元素边框的那个字段要用范围内的像素显示固定的内容,动态边框的那个元素要占用这个固定边框元素的部分像素显示其他的内容,一个要写固定的,一个要改写固定的其中一部分,这样来回调度低层资源或者同时等待资源,就表现为打印的过程非常缓慢或者半天没有响应,然后过了一段时间后台就报OOM了。
像我上面的例子,在取消被保人银行客户编号的Print When Detail Overflows和Stretch With Overflow之后,打印就正常显示了,复测过几次,也没有再出现问题。
所以关于Print When Detail Overflows=true和Stretch With Overflow=true的用法还是需要注意以下几点的:
1)在动态字段元素框分布的不是太密旁边也有空白空间的时候,设置这两个属性为true能够很好的展示动态字段内容
2)在同一个层面上如果要在同一块像素区域类显示两个不同的动态字段内容,设置这两个动态字段为固定边长,Print When Detail Overflows和Stretch With Overflow选项留空
3)对第二点的优化,同一个像素区域显示不同的内容,要分成两层显示(设置前景背景),如果要在同一个区域显示三种及其以上的内容,这时候就像if嵌套一样,要考虑修正需求的合理性,或者采用其他替换的方式展示(比如合并其中两项为一层)
关于Jaspersoft iReport打印引起内存溢出的问题的思考(仅作为一点猜想,欢迎有更精通的人批评指正)
最新推荐文章于 2024-06-18 15:14:23 发布