关于JasperReport的基础应用参考:

IReport+JasperReport+Applet报表打印


应用IReport+JasperReport处理含中文二维码的思路与过程。

  1. 在报表中展现二维条码。

  2. 适应扫描器操作处理(中文转义)。

  3. 结合JS使用条码。


第一部分 在报表中展现二维条码:

    参考:iReport中产生二维条码(QR Code)

    思路:应用zxing工具包生成二维码的图形,并写入在IReport报表的图像组件中。

    步骤1:下载core.jarjavase.jar

    步骤2:引入IReport。

    打开iReport,“工具”—“选项”—“classpath”,然后“Add JAR”,选择上面提到的两个jar文件。

    图片1:

  wKiom1gpeA7ClTKEAAEF7vjEgxc192.png-wh_50  

    加入图像组件,并设定内容表达式,图片2:

    wKiom1gpeA-hdpvGAAEg7GcKMlQ824.png-wh_50

    图像组件的表达式内容:

    com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(

        new com.google.zxing.qrcode.QRCodeWriter().encode(

        new String($P{Code}.getBytes("UTF-8"), "ISO-8859-1")

        ,com.google.zxing.BarcodeFormat.QR_CODE,100,100))

    即:将报表参数Code进行转码(处理中文乱码问题)后进行QRCode编码并写入缓存的图像对象中。

    同时,为了便于在运行时分析,我们建立1个文本框,表达式输入为:

        new String($P{Code}.getBytes("UTF-8"), "ISO-8859-1")

    即:将报表参数Code进行转码结果输入至文本框。

    

    运行效果,图片3:参数Code输入“测试汉字1”

    wKioL1gpeBDSmz71AAC2-NVGW9I941.png-wh_50

    此时的二维码在手机上微信进行扫描的话,可以识别的。图片4:

    wKioL1gpeaXgRDqUAACPm2O__ZU998.png-wh_50

    若基于手机作为终端的话,这样已经可以使用了,若使用扫描器进行读取的话则存在新的问题。


第二部分 适应扫描器操作处理

    扫描器处理二维条码一般会模拟键盘输入,而中文内容无法直接被键盘处理。在图片3的运行效果图中,文本框内显示的乱码内容,就是扫描器接收反馈的内容,即基于键盘输入模拟的扫描器是无法正确处理二维码中文内容的。

    考虑一个曲线救国的办法,将中文内容的“UTF-8编码串”转为字符形式的“ISO-8859-1”编码,将二维码的编码内容修改为,同时加入新的文本框显示响应内容:

    java.net.URLEncoder.encode(

        new String($P{Code}.getBytes("UTF-8"), "ISO-8859-1")   

    ,"ISO8859-1")

    同时为了便于调试,增加回显文本框,表达式为:

    java.net.URLDecoder.decode(

        java.net.URLEncoder.encode( 

            new String($P{Code}.getBytes("UTF-8"), "ISO-8859-1")

         ,"ISO8859-1")

    , "utf-8")

如图片5:

wKiom1gpeBHACjmoAAC2hll0TDA696.png-wh_50

其运行效果如图片6:

wKioL1gpeBHzvvW2AADjdhwnYBo235.png-wh_50

至此中文内容以其UTF-8编码串的内容出现在了二维码中。



第三部分 结合JS使用条码

    应用条码扫描器模拟键盘输入后,网页文本框内将会得到条码值,本例中值为“%E6%B5%8B%E8%AF%95%E6%B1%89%E5%AD%971”

    应用javascript函数decodeURIComponent即可回复其中文内容,图片7:

wKiom1gpeBKzT_x1AABcjXblRVk476.png-wh_50