身份證一類讀卡器讀取的照片信息,保存在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型字段的照片信息拖入單元格,雙擊,在數據列>高級>自定義顯示中使用自定義函數轉換成圖片:
繼承