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

用jasperreports在applet中实现打印功能开发总结

关于Jasperreport部分
1.假如表格需要一行total之类的总结行,可以在select语句中使用union把这行total内容作为表格的数据显示出来,当然涉及到排序,可以再加一列数字列
2.为了开发方便,可以设定一个parameter默认值,并设定为不提示输入的方式,示例代码:
<parameter name="poNo" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["4500198874"]]></defaultValueExpression>
</parameter>
3.发现一个问题,在主报表中detail与column footer总是存在一条空白,由于我的这个报表的表头与页尾之类的内容都用线包裹起来的,所以这条空白格太难看了。经过非常多的测试后,发现在子报表中就不存在这条空白,所以必须要用子报表实现这个功能。
4.对于一些重复的代码,可以使用variable来定义变量,然后就可以在其他地方使用了,比如:
定义:
<variable name="COMPANY_ADDRESS" class="java.lang.String">
<variableExpression><![CDATA[( $F{COMPANY_CODE}.equalsIgnoreCase("sh") ?
"公司上海地址"
:
"其它地方地址"
)]]></variableExpression>
使用:
<textField>
<reportElement x="276" y="101" width="526" height="57"/>
<textElement markup="html">
<font fontName="宋体" size="8"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{COMPANY_ADDRESS}]]></textFieldExpression>
</textField>
5.对于需要换行的动态内容,可以把markup设置为html,然后在内容添加<br>标签,比如:
<textField pattern="">
<reportElement x="459" y="104" width="51" height="23"/>
<textElement textAlignment="Center" markup="html">
<font fontName="宋体" size="8"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA["单价"+$P{CURRENCY}+"<br>Unit Price"]]></textFieldExpression>
</textField>
6.用一些变量来区分开发与生产环境,比如:子报表的位置在开发与生产环境是不一样的,在开发环境中我们用文件系统的绝对位置,在生产环境中使用URL地址,那我们就可以使用一些变量来区分,这样就不会每次开发好了需要修改子报表地址,比如:
( $P{MODE}.equals("test") ?
"C:\\reports\\order.jasper"
:
$P{URL}+"/reports/order.jasper"
)
7.关于图片的显示,可以用两种方式来显示图片:
A.假如直接从数据库查出Blob字段图片,则直接可以在报表中把Field类型改为java.awt.Image类型,然后把这个变量付给报表的Image标签,比如:
SIGNATURE是Blob字段
<field name="SIGNATURE" class="java.awt.Image"/>
<image>
<reportElement x="599" y="47" width="34" height="35"/>
<imageExpression class="java.awt.Image"><![CDATA[$P{SIGNATURE}]]></imageExpression>
</image>
B.显示文件系统图片,或者通过URL访问的
<variable name="LOGO_URL" class="java.lang.String">
<variableExpression><![CDATA[( $P{MODE}.equals("test") ?
"C:\\images\\logo.jpg"
:
$P{URL}+"/images/logo.jpg"
)]]></variableExpression>
<image>
<reportElement x="101" y="98" width="35" height="31"/>
<imageExpression class="java.lang.String"><![CDATA[$P{LOGO_URL}]]></imageExpression>
</image>
8.关于划线技巧,在iReport里想选中一条线是非常困难的,但是我们可以用左面的Report Inspector界面选中,然后直接在属性框中修改位置与长度,假如想让线左对齐的话,可以选中很多条线,一起在属性框中修改Left属性,当然其他对齐方式,可以相应修改Top,Width,Height等属性
9.假如在一个主报表中,有2个子报表(我没测试2个以上子报表),而且我们想让每个子报表的起始页都在独立一页中,而不是紧接着上页的后面显示,那怎么办呢?可以在主报表中拉大detail的band高度,留下的空间,不足以显示第二个子报表的页头或者表头等(当然,要看第二个子报表的页头连贯的长度),具体设置为多长,只能自己摸索了。
10.关于子报表,可以在detail中放置多个子报表,每个子报表放在一个独立band中

关于Applet部分:
1.jasperreports提供了一个用swing实现的具有预览功能的面板JRViewer,这个面板在iReport里面大量使用,applet打印功能也就是再放一个JRViewer
2.applet功能需要依赖的jar包:commons-collections-2.1.1.jar,commons-digester-1.7.jar,commons-logging-1.0.4.jar,jasperreports-3.7.4.jar,jasperreports-applet-3.7.4.jar,jasperreports-fonts-3.7.4.jar
3.开始的时候,可以参考japserreports提供的demo里有关于applet的示例代码。
4.把applet的package与html中applet标签的codebase没有直接关系,codebase是applet标签寻找所有与applet相关资源的根目录,我们jar包,签名证书等都放到codebase目录下,code属性的值必须用Applet类的全名,包括pacakage。
5.由于applet依赖很多jar包,这里我们可以把所有的jar解压缩,然后再与Applet类打包到一个jar,也可以保留现状,单独打包applet,但是需要单独对每个jar进行签名认证,可能比较麻烦一些。但是有些时候,一些第三方jar的license是不允许重新打包的,那就必须要单独放置jar包。记住,必须要对每个jar单独签名,不能只对applet jar包签名。否则还是会显示权限不对
6.jar签名认证流程
(1)生成证书: keytool -genkey -alias printkey -dname "CN=TKE, OU=TKE, O=TKE, L=sh, ST=sh,C=cn" -keystore printstore -keypass tkeportal -storepass tkeportal -validity 3650
默认的签名只有半年的有效期,这里我们用-validity参数设定为10年的有效期
(2)导出证书: keytool -export -keystore printstore -alias printkey -file print.cer -storepass tkeportal
(3)对jar包签名:
jarsigner -keystore printstore reportprint.jar printkey
jarsigner -keystore printstore barbecue-1.5-beta1.jar printkey
jarsigner -keystore printstore commons-collections-2.1.1.jar printkey
jarsigner -keystore printstore commons-digester-1.7.jar printkey
jarsigner -keystore printstore commons-logging-1.0.4.jar printkey
jarsigner -keystore printstore jasperreports-3.7.4.jar printkey
jarsigner -keystore printstore jasperreports-applet-3.7.4.jar printkey
jarsigner -keystore printstore jasperreports-fonts-3.7.4.jar printkey
7.JSP里Applet示例代码:
<APPLET WIDTH="1160" HEIGHT="470">
<PARAM NAME=CODE VALUE="com.tke.applet.EmbeddedViewerApplet.class" >
<PARAM NAME=CODEBASE VALUE="${ctx}/applet" >
<PARAM NAME=ARCHIVE VALUE="reportprint.jar,barbecue-1.5-beta1.jar,commons-collections-2.1.1.jar,commons-digester-1.7.jar,commons-logging-1.0.4.jar,jasperreports-3.7.4.jar,jasperreports-applet-3.7.4.jar,jasperreports-fonts-3.7.4.jar" >
<PARAM NAME="type" VALUE="application/x-java-applet;version=1.5">
<PARAM NAME="scriptable" VALUE="false">
<PARAM NAME="REPORT_URL" VALUE="${ctx}/order/loadJasperPrint.action?poNo=<s:property value='poNo'/>">
</APPLET>
8.codebase最好包括context名称,因为包括applet的代码不一定是在根目录下,我们平时看到好多示例代码都是在根目录来演示的,所以不需要context
9.假如出现如下错误,原因可能是客户端的包括一个同名的旧签名证书,只要删除就可以了。
此发行者无法被验证时可信来源。代码将按未签名处理。
sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: signature check failed
10.每次更新了Applet相关文件,比如jar包与证书,都需要关闭当前浏览器,重新登录系统。
11.假如用到barcode功能,但是applet中未加载barbecue-1.5-beta1.jar,则applet会报一个不相干的错误:
ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error

相关文章:

  • Serializable 和 Parcelable 两种序列化
  • javax.servlet.ServletException: BeanUtils.populate的解决
  • 文件系统性能测试
  • BIEE在windows Server 2003 64bit上安装
  • android 蓝牙学习笔记
  • [QT] TCP协议演示
  • content_for对应的yield
  • 四十八、Qt网络(八)TCP(二)
  • GetDlgItem用法
  • 四十七、Qt网络(七)TCP(一)
  • 四十六、Qt网络(六)UDP
  • 评估一款电子邮件营销软件的方法总结
  • 四十四、Qt网络(四)FTP(二)
  • DevExpress点滴学习--换肤
  • 四十二、Qt网络(二)HTTP编程
  • php的引用
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • angular组件开发
  • FastReport在线报表设计器工作原理
  • js正则,这点儿就够用了
  • python docx文档转html页面
  • 初探 Vue 生命周期和钩子函数
  • 对象引论
  • 复杂数据处理
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端面试之闭包
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一文看透浏览器架构
  • 原生Ajax
  • 转载:[译] 内容加速黑科技趣谈
  • 从如何停掉 Promise 链说起
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (6)添加vue-cookie
  • (C#)一个最简单的链表类
  • (八十八)VFL语言初步 - 实现布局
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (蓝桥杯每日一题)love
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .apk 成为历史!
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .form文件_SSM框架文件上传篇
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net环境下的缓存技术介绍
  • .NET轻量级ORM组件Dapper葵花宝典
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]