IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    wangjian5748发表于 2010-07-30 16:29:00
    love 0

    关于Jasperreport部分
    1.假如表格需要一行total之类的总结行,可以在select语句中使用union把这行total内容作为表格的数据显示出来,当然涉及到排序,可以再加一列数字列
    2.为了开发方便,可以设定一个parameter默认值,并设定为不提示输入的方式,示例代码:



    3.发现一个问题,在主报表中detail与column footer总是存在一条空白,由于我的这个报表的表头与页尾之类的内容都用线包裹起来的,所以这条空白格太难看了。经过非常多的测试后,发现在子报表中就不存在这条空白,所以必须要用子报表实现这个功能。
    4.对于一些重复的代码,可以使用variable来定义变量,然后就可以在其他地方使用了,比如:
    定义:


    使用:







    5.对于需要换行的动态内容,可以把markup设置为html,然后在内容添加
    标签,比如:







    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字段





    B.显示文件系统图片,或者通过URL访问的






    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示例代码:






    ">

    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



沪ICP备19023445号-2号
友情链接