如何读取Access里的OLE类型的图片

本文介绍如何使用FineReport报表工具展示Access数据库中由身份证读卡器写入的OLE型字段照片信息。通过自定义函数BinaryImage,借助Java JNA技术调用本地DLL文件进行图片格式转换。

身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据。

再用报表或EXCEL读取这些图片时,如果将该图片字段拖入单元格后,预览就看不到图片了。EXCEL如何读取这类图片网上有教程,这里不多说。如果你要用报表软件FineReport来展现这类图片该如何做呢?

思路是采用FineReport的自定义函数,使用javajna调用本地的WltRS.dll,将数据库OLE字段中的长二进制数据转为.wlt文件,再调用本地方法将.wlt文件转为.bmp图片,最终自定义函数返回图片在FineReport中显示。

<!--[if !supportLists]-->1、<!--[endif]-->前提准备

本地库文件WltRS.dll保存在E:\bmp\WltRS.dll(位置可变,但ixu保证以自定义函数中的路径一致);eclipse项目中导入FINEREPORTjar包。

<!--[if !supportLists]-->2、<!--[endif]-->实现自定义函数

 

自定义一个函数类BinaryImage.java,该类继承AbstractFunction,在run()方法中使用javajna调用本地库文件WltRS.dll,最终返回图片。代码如下:


点击(此处)折叠或打开

  1. package com.FineReport.function;
  2.    
  3. import java.awt.image.BufferedImage;
  4. import java.io.BufferedOutputStream;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8.    
  9. import javax.imageio.ImageIO;
  10.    
  11. import com.FineReport.data.core.db.BinaryObject;
  12. import com.FineReport.script.AbstractFunction;
  13. import com.sun.jna.Library;
  14. import com.sun.jna.Native;
  15.    
  16. public class BinaryImage extends AbstractFunction{
  17.    
  18.         //加载dll,"E:\\bmp\\WltRS"是dll的文件完整路径,但不带后缀名,生成WltRS.class
  19.         static WltRS wltrs = (WltRS) Native.loadLibrary("E:\\bmp\\WltRS", WltRS.class);
  20.          
  21.         static int index = 0;
  22.          
  23.         public Object run(Object[] args) {
  24.                  
  25.                 int current = index;
  26.                  
  27.                 //args[0] 是 BinaryObject对象,取为bo
  28.                 BinaryObject bo = (BinaryObject)args[0];
  29.                  
  30.                 //将bo转换为.wlt文件,并保存在位置E:\bmp\;本地方法GetBmp的第一个参数是wlt文件的路径
  31.                 getFile(bo.getBytes(), "E:\\bmp\\", current + ".wlt");
  32.                  
  33.                 //读取.wlt为文件
  34.                 File file = new File("E:\\bmp\\" + current + ".wlt");
  35.                  
  36.                 //调用本地方法,在相同路径下生产.bmp
  37.                 wltrs.GetBmp("E:\\bmp\\" + current + ".wlt", 1);
  38.                  
  39.                 //读取并返回图片
  40.                 File imagefile = new File("E:\\bmp\\" + current + ".bmp");
  41.                 BufferedImage buffer = null;
  42.                 try {
  43.                         buffer = ImageIO.read(imagefile);
  44.                 } catch (IOException e) {
  45.                         e.printStackTrace();
  46.                 }
  47.                  
  48.                 index = (++index)%300;
  49.                 return buffer;
  50.         }
  51.          
  52.          
  53.         // byte[]转换为file的方法
  54.         public static void getFile(byte[] bfile, String filePath, String fileName) {
  55.         BufferedOutputStream bos = null;
  56.         FileOutputStream fos = null;
  57.         File file = null;
  58.         try {
  59.             File dir = new File(filePath);
  60.             if(!dir.exists() && dir.isDirectory()){//判断文件目录是否存在
  61.                 dir.mkdirs();
  62.             }
  63.             file = new File(filePath+"\\"+fileName);
  64.             fos = new FileOutputStream(file);
  65.             bos = new BufferedOutputStream(fos);
  66.             bos.write(bfile);
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         } finally {
  70.             if (bos != null) {
  71.                 try {
  72.                     bos.close();
  73.                 } catch (IOException e1) {
  74.                     e1.printStackTrace();
  75.                 }
  76.             }
  77.             if (fos != null) {
  78.                 try {
  79.                     fos.close();
  80.                 } catch (IOException e1) {
  81.                     e1.printStackTrace();
  82.                 }
  83.             }
  84.         }
  85.     }
  86. }
  87.    
  88. //用jna调用本地方法的必须步骤,具体含义不明
  89. interface WltRS extends Library{
  90.         //定义要调用的本地方法
  91.         void GetBmp(String str, int i);
  92. }


 将编译后的BinaryImage.classWltRS.class根据包名拷贝至报表工程如报表安装目录下的WebReport\WEB-INF\classes\com\FineReport\function\文件夹下。

3、使用自定义函数

OLE类型字段的值显示为图片。启动设计器,点击服务器>函数管理器,新增自定义函数BINARYIMAGE,选择com.FineReport.function.BinaryImage类:



 
将身份证读卡器写入Access数据库OLE型字段的照片信息拖入单元格,双击,在数据列>高级>自定义显示中使用自定义函数转换成图片:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21472864/viewspace-2123712/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21472864/viewspace-2123712/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值