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

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

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

1、前提准备

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

2、实现自定义函数

自定义一个函数类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型字段的照片信息拖入单元格,双击,在数据列>高级>自定义显示中使用自定义函数转换成图片:

如何读取Access里的OLE类型的图片的更多相关文章

  1. 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)

    解剖SQLSERVER 第四篇  OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...

  2. java读取ACCESS数据库的简单示例

    java读取ACCESS数据库的简单示例 虽然简单,对初学者来说,如果没有一段可以成功执行的代码供参考,还真难调试 先用ACCESS建一个数据库 DB1.MDB,里面有一表"table1&q ...

  3. PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)

    PHP使用UTF8编码读取ACCESS的乱码问题解决方案 http://it.xwstudy.com/readnews.php?id=627 来源:本站编辑 发布日期:2013-05-27 已有 17 ...

  4. dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息

    在 Office 中,可以在 PPT 里面插入表格,插入表格有好多不同的方法,对应 OpenXML 文档存储的更多不同的方式.本文来介绍如何读取 PPT 内嵌 ole 格式的 xls+ 表格的方法 在 ...

  5. access里like的通配符不能用%,要用*

    转自http://www.knowsky.com/339881.html access里like的通配符用法是这样:     “?”表示任何单一字符: “*”表示零个或多个字符: “#”表示任何一个数 ...

  6. php 读取文件头判断文件类型的实现代码

    php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 例子: <?php $filename = "11.jpg"; //为图片的路径可以用d:/uploa ...

  7. access数据库:怎么直接从access里把数据里同样的文字替换成空字符&quot;&quot;

    access数据库:怎么直接从access里把数据里同样的文字替换成空字符"" 搜所到文字后,替换的项里写"",就是了.一定要是英文的""

  8. 转:JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...

  9. JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...

随机推荐

  1. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

  2. c# 生成SHA1加密字符串

    从网上找到的一种加密代码: var enstr ="abcdefg"; var strRes = Encoding.Default.GetBytes(enstr); HashAlg ...

  3. Extjs.FormPanel

    刚刚学习ExtJS ,备注一哈代码 防止忘记... <html xmlns="http://www.w3.org/1999/xhtml"> <head runat ...

  4. XML 动态 插入 父类标示 子类标示

    由于第一次写博客,写的不好的地方,还请各位大神多多指点, 讲解一下:xml动态插入数据并保存,写这个时候费了我不少劲,最后终于皇天不负有心人让我搞出来了,特意分享给大家,写的不完美的地方还请大家多多指 ...

  5. Hibernate实现有两种配置,xml配置与注释配置

    hibernate实现有两种配置,xml配置与注释配置. (1):xml配置:hibernate.cfg.xml (放到src目录下)和实体配置类:xxx.hbm.xml(与实体为同一目录中) < ...

  6. Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器

    回到目录 关于依赖倒置(DIP) 高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口,通俗的讲,就是高层模块定义接口,低层模块负责实现,这在我们实际开发中经常被用到,层与层之间引用,经 ...

  7. jQuery手机端触摸卡片切换效果

    效果:http://hovertree.com/code/run/jquery/a1gr3gm9.html 可以用手机查看效果. 代码如下: <!doctype html> <htm ...

  8. 【HTML5&CSS3进阶学习01】气泡组件的实现

    前言 气泡组件在实际工作中非常普遍,无论是网页中还是app中,比如: 我们这里所谓气泡组件是指列表型气泡组件,这里就其dom实现,css实现,js实现做一个讨论,最后对一些细节点做一些说明,希望对各位 ...

  9. arcgis for flex全国地图天气预报的具体实现过程解析

    系统架构是B/S,开发语言是flex,开发工具是myeclise或者flashbuild,通过调用百度提供的在线天气预报web api接口的方式来实现. 采用地图是ArcGIS全国地图,开发接口为ar ...

  10. 修改ArcSDE的最大连接数

    我们大体都知道ArcSDE的连接数有 48 的限制,很多人也知道这个参数可以修改,并且每种操作系统能支持的最大连接数是不同的. 如果应用报错:超出系统最大连接数该如何处理? 两种解决办法: 第一,首先 ...