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

简介:

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

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

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

1、前提准备

本地库文件WltRS.dll保存在E:\bmp\WltRS.dll(位置可变,但ixu保证以自定义函数中的路径一致);eclipse项目中导入FINEREPORTjar包。

2、实现自定义函数

自定义一个函数类BinaryImage.java,该类继承AbstractFunction,在run()方法中使用javajna调用本地库文件WltRS.dll,最终返回图片。代码如下:

Java代码 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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型字段的照片信息拖入单元格,双击,在数据列>高级>自定义显示中使用自定义函数转换成图片:



本文转自 雄霸天下啦 51CTO博客,原文链接:http://blog.51cto.com/10549520/1840187,如需转载请自行联系原作者

相关文章
|
Linux 芯片 开发者
|
移动开发 JavaScript Oracle
Oracle根据汉字取拼音首字母的function
Oracle根据汉字取拼音首字母的function
9311 0
|
分布式计算 运维 监控
Dataphin离线数仓搭建深度测评:数据工程师的实战视角
作为一名金融行业数据工程师,我参与了阿里云Dataphin智能研发版的评测。通过《离线数仓搭建》实践,体验了其在数据治理中的核心能力。Dataphin在环境搭建、管道开发和任务管理上显著提效,如测试环境搭建从3天缩短至2小时,复杂表映射效率提升50%。产品支持全链路治理、智能提效和架构兼容,帮助企业降低40%建设成本,缩短60%需求响应周期。建议加强行业模板库和移动适配功能,进一步提升使用体验。
|
7月前
|
安全 NoSQL API
拼多多:通过微信支付API实现社交裂变付款的技术解析
基于微信JSAPI构建社交裂变支付系统,用户发起拼单后生成预订单与分享链接,好友代付后通过回调更新订单并触发奖励。集成微信支付、异步处理、签名验签与Redis关系绑定,提升支付成功率与裂变系数,实现高效安全的闭环支付。
807 0
|
弹性计算 运维 安全
阿里云操作系统迁移最佳实践|飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是阿里云操作系统迁移最佳实践,Alibaba Cloud Linux /Anolis OS 兼容 CentOS 生态,因此能够很丝滑的进行迁移替换。无论是对企业的运维人员,还是对企业操作系统的使用者来说,相对简化了它的维护成本。通过 SMC 操作系统迁移实践带用户深入了解,不仅阐述了原地迁移方案的独特优势,还针对不同的迁移场景,逐步剖析了整个迁移流程,力求使复杂的操作变得直观易懂,实现了真正的“白屏化”体验。 1. CentOS 迁移背景 2. 操作系统迁移实践 3. 迁移故障处理
457 2
|
调度 开发者 Python
探索Python中的异步编程:从asyncio到Trio
在这个快节奏的技术世界里,Python的异步编程正变得越来越重要。本文将带你深入Python的异步编程世界,从asyncio的基础用法,到Trio的高级特性,我们将一探究竟。准备好,让我们一起揭开Python异步编程的神秘面纱。
|
存储 Java
Java——final关键字,String为什么不可变
不知道大家有没有这样的疑问:我们在使用某些Java的类或者方法、属性(比如:String类)时,总是会发现前面有一个final进行修饰,那为什么要使用final呢?final在其中起到了什么作用呢?为什么String类不可变呢?且往下看
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
1076 3
|
数据采集 安全 网络安全
阿里云云效产品使用问题之流水线的环境可以在什么地方进行配置
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
Oracle 关系型数据库 数据库
实时计算 Flink版操作报错合集之报错 NoResourceAvailableException 是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
558 0

热门文章

最新文章

下一篇
开通oss服务