如何读取Access里的OLE类型的图片
身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据。
再用报表或EXCEL读取这些图片时,如果将该图片字段拖入单元格后,预览就看不到图片了。EXCEL如何读取这类图片网上有教程,这里不多说。如果你要用报表软件FineReport来展现这类图片该如何做呢?
思路是采用FineReport的自定义函数,使用java的jna调用本地的WltRS.dll,将数据库OLE字段中的长二进制数据转为.wlt文件,再调用本地方法将.wlt文件转为.bmp图片,最终自定义函数返回图片在FineReport中显示。
<!--[if !supportLists]-->1、<!--[endif]-->前提准备
本地库文件WltRS.dll保存在E:\bmp\WltRS.dll(位置可变,但ixu保证以自定义函数中的路径一致);eclipse项目中导入FINEREPORT的jar包。
<!--[if !supportLists]-->2、<!--[endif]-->实现自定义函数
自定义一个函数类BinaryImage.java,该类继承AbstractFunction,在run()方法中使用java的jna调用本地库文件WltRS.dll,最终返回图片。代码如下:
package com.FineReport.function; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import com.FineReport.data.core.db.BinaryObject; import com.FineReport.script.AbstractFunction; import com.sun.jna.Library; import com.sun.jna.Native; public class BinaryImage extends AbstractFunction{ //加载dll,"E:\\bmp\\WltRS"是dll的文件完整路径,但不带后缀名,生成WltRS.class static WltRS wltrs = (WltRS) Native.loadLibrary("E:\\bmp\\WltRS", WltRS.class); static int index = 0; public Object run(Object[] args) { int current = index; //args[0] 是 BinaryObject对象,取为bo BinaryObject bo = (BinaryObject)args[0]; //将bo转换为.wlt文件,并保存在位置E:\bmp\;本地方法GetBmp的第一个参数是wlt文件的路径 getFile(bo.getBytes(), "E:\\bmp\\", current + ".wlt"); //读取.wlt为文件 File file = new File("E:\\bmp\\" + current + ".wlt"); //调用本地方法,在相同路径下生产.bmp wltrs.GetBmp("E:\\bmp\\" + current + ".wlt", 1); //读取并返回图片 File imagefile = new File("E:\\bmp\\" + current + ".bmp"); BufferedImage buffer = null; try { buffer = ImageIO.read(imagefile); } catch (IOException e) { e.printStackTrace(); } index = (++index)%300; return buffer; } // byte[]转换为file的方法 public static void getFile(byte[] bfile, String filePath, String fileName) { BufferedOutputStream bos = null; FileOutputStream fos = null; File file = null; try { File dir = new File(filePath); if(!dir.exists() && dir.isDirectory()){//判断文件目录是否存在 dir.mkdirs(); } file = new File(filePath+"\\"+fileName); fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(bfile); } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } } //用jna调用本地方法的必须步骤,具体含义不明 interface WltRS extends Library{ //定义要调用的本地方法 void GetBmp(String str, int i); }
将编译后的BinaryImage.class、WltRS.class根据包名拷贝至报表工程如报表安装目录下的WebReport\WEB-INF\classes\com\FineReport\function\文件夹下。
3、使用自定义函数
将OLE类型字段的值显示为图片。启动设计器,点击服务器>函数管理器,新增自定义函数BINARYIMAGE,选择com.FineReport.function.BinaryImage类:
将身份证读卡器写入Access数据库OLE型字段的照片信息拖入单元格,双击,在数据列>高级>自定义显示中使用自定义函数转换成图片:
推荐阅读
-
ai如何裁剪图片 illustrator里把图像裁剪为任意形状的技巧
-
postman做接口测试,body穿json格式的参数,json中的参数值是list类型,且列表项是图片时如何传参
-
最新图片隐藏方法 如何隐藏电脑里的图片
-
如何在postman里为类型为Edm.DateTime的OData参数指定正确格式的值 postmanSAPSAP云平台SAP Cloud PlatformABAP
-
Word文档里的动态的图片不动如何在PPT上显示动态图片
-
文档里图片太多手动费事如何将Word里的图片自动批量导出来
-
wps如何在ppt里设置图片三维旋转 wps在ppt里设置三维旋转的方法
-
如何批量压缩PPT2003里面的图片让幻灯片的生成体积更小
-
thinkphp 在哪里读取的Conf/conf.php文件里的数据库配置信息,该如何处理
-
急怎样去掉评论栏里的phpcms图片啊该如何处理