帆软软件
作者帆软软件·2016-08-19 10:30
产品经理·帆软软件

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

字数 8104阅读 9248评论 1赞 0

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

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

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

1、 前提准备

本地库文件WltRS.dll保存在E:bmpWltRS.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 extendsAbstractFunction{

 

        //加载dll,"E:\bmp\WltRS"是dll的文件完整路径,但不带后缀名,生成WltRS.class

        staticWltRS wltrs = (WltRS) Native.loadLibrary("E:\bmp\WltRS",WltRS.class);

       

        staticint index = 0;

       

        publicObject run(Object[] args) {

               

                intcurrent = index;

               

                //args[0]是 BinaryObject对象,取为bo

                BinaryObjectbo = (BinaryObject)args[0];

               

                //将bo转换为.wlt文件,并保存在位置E:bmp;本地方法GetBmp的第一个参数是wlt文件的路径

                getFile(bo.getBytes(),"E:\bmp\", current + ".wlt");

               

                //读取.wlt为文件

                Filefile = new File("E:\bmp\" + current + ".wlt"); 

               

                //调用本地方法,在相同路径下生产.bmp

                wltrs.GetBmp("E:\bmp\"+ current + ".wlt", 1);

               

                //读取并返回图片

                Fileimagefile = new File("E:\bmp\" + current + ".bmp");

                BufferedImagebuffer = null;

                try{

                        buffer= ImageIO.read(imagefile);

                }catch (IOException e) {

                        e.printStackTrace();

                }

               

                index= (++index)%300;

                returnbuffer;

        }

       

       

        //byte[]转换为file的方法

        publicstatic 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 = newFile(filePath+"\"+fileName); 

            fos = newFileOutputStream(file); 

            bos = newBufferedOutputStream(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{

        //定义要调用的本地方法

        voidGetBmp(String str, int i);

}

将编译后的BinaryImage.class、WltRS.class根据包名拷贝至报表工程如报表安装目录下的WebReportWEB-INFclassescomFineReportfunction文件夹下。

3、使用自定义函数

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

1.png

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

2.png

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论1 条评论

hua345100847hua345100847项目经理亚夏
2016-08-25 17:30
学习
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广