身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据。
再用报表或EXCEL读取这些图片时,如果将该图片字段拖入单元格后,预览就看不到图片了。EXCEL如何读取这类图片网上有教程,这里不多说。如果你要用报表软件FineReport来展现这类图片该如何做呢?
思路是采用FineReport的自定义函数,使用java的jna调用本地的WltRS.dll,将数据库OLE字段中的长二进制数据转为.wlt文件,再调用本地方法将.wlt文件转为.bmp图片,最终自定义函数返回图片在FineReport中显示。
1、前提准备
本地库文件WltRS.dll保存在E:\bmp\WltRS.dll(位置可变,但ixu保证以自定义函数中的路径一致);eclipse项目中导入FINEREPORT的jar包。
2、实现自定义函数
自定义一个函数类BinaryImage.java,该类继承AbstractFunction,在run()方法中使用java的jna调用本地库文件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.class、WltRS.class根据包名拷贝至报表工程如报表安装目录下的WebReport\WEB-INF\classes\com\FineReport\function\文件夹下。
3、使用自定义函数
将OLE类型字段的值显示为图片。启动设计器,点击服务器>函数管理器,新增自定义函数BINARYIMAGE,选择com.FineReport.function.BinaryImage类:
将身份证读卡器写入Access数据库OLE型字段的照片信息拖入单元格,双击,在数据列>高级>自定义显示中使用自定义函数转换成图片:
本文转自 雄霸天下啦 51CTO博客,原文链接:http://blog.51cto.com/10549520/1840187,如需转载请自行联系原作者