如何讀取Access裏的OLE類型的圖片

身份證一類讀卡器讀取的照片信息,保存在Access數據庫中通常爲OLE型字段,圖片爲BMP格式,由於是用其讀卡器寫入的,其數據類型爲常二進制數據。 再用報表或EXCEL讀取這些圖片時,若是將該圖片字段拖入單元格後,預覽就看不到圖片了。EXCEL如何讀取這類圖片網上有教程,這裏很少說。若是你要用報表軟件FineReport來展示這類圖片該如何作呢? 思路是採用FineReport的自定義函數,使用java的jna調用本地的WltRS.dll,將數據庫OLE字段中的長二進制數據轉爲.wlt文件,再調用本地方法將.wlt文件轉爲.bmp圖片,最終自定義函數返回圖片在FineReport中顯示。 一、前提準備 本地庫文件WltRS.dll保存在E:\bmp\WltRS.dll(位置可變,但ixu保證以自定義函數中的路徑一致);eclipse項目中導入FINEREPORT的jar包。 二、實現自定義函數java

自定義一個函數類BinaryImage.java,該類繼承AbstractFunction,在run()方法中使用java的jna調用本地庫文件WltRS.dll,最終返回圖片。代碼以下: Java代碼 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;eclipse

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();   
            }   
        }   
    }   
}

}code

//用jna調用本地方法的必須步驟,具體含義不明
interface WltRS extends Library{
//定義要調用的本地方法
void GetBmp(String str, int i);
}
將編譯後的BinaryImage.class、WltRS.class根據包名拷貝至報表工程如報表安裝目錄下的WebReport\WEB-INF\classes\com\FineReport\function\文件夾下。 三、使用自定義函數 將OLE類型字段的值顯示爲圖片。啓動設計器,點擊服務器>函數管理器,新增自定義函數BINARYIMAGE,選擇com.FineReport.function.BinaryImage類:對象

輸入圖片說明 將身份證讀卡器寫入Access數據庫OLE型字段的照片信息拖入單元格,雙擊,在數據列>高級>自定義顯示中使用自定義函數轉換成圖片: 輸入圖片說明繼承

相關文章
相關標籤/搜索