欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-27 16:10:01
...

身份证一类读卡器读取的照片信息,保存在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,最终返回图片。代码如下:

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.classWltRS.class根据包名拷贝至报表工程如报表安装目录下的WebReport\WEB-INF\classes\com\FineReport\function\文件夹下。

3、使用自定义函数

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


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


如何读取Access里的OLE类型的图片
            
    
    博客分类: Finereport 数据库OLEaccessjava 
 

 

  • 如何读取Access里的OLE类型的图片
            
    
    博客分类: Finereport 数据库OLEaccessjava 
  • 大小: 20.7 KB
  • 如何读取Access里的OLE类型的图片
            
    
    博客分类: Finereport 数据库OLEaccessjava 
  • 大小: 12 KB