Java軟件報表軟件技術博客

          java報表軟件技術匯總 java報表軟件制作 報表軟件新聞
          posts - 355, comments - 100, trackbacks - 0, articles - 3
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          身份證一類讀卡器讀取的照片信息,保存在Access數(shù)據(jù)庫中一般為OLE型字段,圖片為BMP格式,因為是用其讀卡器寫入的,其數(shù)據(jù)類型為常二進制數(shù)據(jù)。

          再用報表或EXCEL讀取這些圖片時,如果將該圖片字段拖入單元格后,預覽就看不到圖片了。EXCEL如何讀取這類圖片網(wǎng)上有教程,這里不多說。如果你要用報表軟件FineReport來展現(xiàn)這類圖片該如何做呢?

          思路是采用FineReport的自定義函數(shù),使用javajna調用本地的WltRS.dll,將數(shù)據(jù)庫OLE字段中的長二進制數(shù)據(jù)轉為.wlt文件,再調用本地方法將.wlt文件轉為.bmp圖片,最終自定義函數(shù)返回圖片在FineReport中顯示。

          1、前提準備

          本地庫文件WltRS.dll保存在E:\bmp\WltRS.dll(位置可變,但ixu保證以自定義函數(shù)中的路徑一致);eclipse項目中導入FINEREPORTjar包。

          2、實現(xiàn)自定義函數(shù)

           

          自定義一個函數(shù)類BinaryImage.java,該類繼承AbstractFunction,在run()方法中使用javajna調用本地庫文件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;  
             
          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的第一個參數(shù)是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根據(jù)包名拷貝至報表工程如報表安裝目錄下的WebReport\WEB-INF\classes\com\FineReport\function\文件夾下。

          3、使用自定義函數(shù)

          OLE類型字段的值顯示為圖片。啟動設計器,點擊服務器>函數(shù)管理器,新增自定義函數(shù)BINARYIMAGE,選擇com.FineReport.function.BinaryImage類:



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




          主站蜘蛛池模板: 永春县| 县级市| 黄石市| 随州市| 台北县| 田林县| 改则县| 海宁市| 新竹县| 连山| 丹棱县| 桑植县| 睢宁县| 南郑县| 罗源县| 永川市| 油尖旺区| 焦作市| 秦安县| 五峰| 那曲县| 浦县| 江油市| 五华县| 新野县| 甘南县| 阳高县| 明星| 岳池县| 龙南县| 紫云| 南雄市| 温泉县| 兴业县| 论坛| 徐闻县| 安平县| 昌邑市| 咸阳市| 汽车| 东平县|