天天看点

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

身份证一类读卡器读取的照片信息,保存在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代码 

<code>package</code> <code>com.FineReport.function;  </code>

<code>   </code> 

<code>import</code> <code>java.awt.image.BufferedImage;  </code>

<code>import</code> <code>java.io.BufferedOutputStream;  </code>

<code>import</code> <code>java.io.File;  </code>

<code>import</code> <code>java.io.FileOutputStream;  </code>

<code>import</code> <code>java.io.IOException;  </code>

<code>import</code> <code>javax.imageio.ImageIO;  </code>

<code>import</code> <code>com.FineReport.data.core.db.BinaryObject;  </code>

<code>import</code> <code>com.FineReport.script.AbstractFunction;  </code>

<code>import</code> <code>com.sun.jna.Library;  </code>

<code>import</code> <code>com.sun.jna.Native;  </code>

<code>public</code> <code>class</code> <code>BinaryImage </code><code>extends</code> <code>AbstractFunction{  </code>

<code>        </code><code>//加载dll,"E:\\bmp\\WltRS"是dll的文件完整路径,但不带后缀名,生成WltRS.class  </code>

<code>        </code><code>static</code> <code>WltRS wltrs = (WltRS) Native.loadLibrary(</code><code>"E:\\bmp\\WltRS"</code><code>, WltRS.</code><code>class</code><code>);  </code>

<code>         </code> 

<code>        </code><code>static</code> <code>int</code> <code>index = </code><code>0</code><code>;  </code>

<code>        </code><code>public</code> <code>Object run(Object[] args) {  </code>

<code>                 </code> 

<code>                </code><code>int</code> <code>current = index;  </code>

<code>                </code><code>//args[0] 是 BinaryObject对象,取为bo  </code>

<code>                </code><code>BinaryObject bo = (BinaryObject)args[</code><code>0</code><code>];  </code>

<code>                </code><code>//将bo转换为.wlt文件,并保存在位置E:\bmp\;本地方法GetBmp的第一个参数是wlt文件的路径  </code>

<code>                </code><code>getFile(bo.getBytes(), </code><code>"E:\\bmp\\"</code><code>, current + </code><code>".wlt"</code><code>);  </code>

<code>                </code><code>//读取.wlt为文件  </code>

<code>                </code><code>File file = </code><code>new</code> <code>File(</code><code>"E:\\bmp\\"</code> <code>+ current + </code><code>".wlt"</code><code>);   </code>

<code>                </code><code>//调用本地方法,在相同路径下生产.bmp  </code>

<code>                </code><code>wltrs.GetBmp(</code><code>"E:\\bmp\\"</code> <code>+ current + </code><code>".wlt"</code><code>, </code><code>1</code><code>);  </code>

<code>                </code><code>//读取并返回图片  </code>

<code>                </code><code>File imagefile = </code><code>new</code> <code>File(</code><code>"E:\\bmp\\"</code> <code>+ current + </code><code>".bmp"</code><code>);  </code>

<code>                </code><code>BufferedImage buffer = </code><code>null</code><code>;  </code>

<code>                </code><code>try</code> <code>{  </code>

<code>                        </code><code>buffer = ImageIO.read(imagefile);  </code>

<code>                </code><code>} </code><code>catch</code> <code>(IOException e) {  </code>

<code>                        </code><code>e.printStackTrace();  </code>

<code>                </code><code>}  </code>

<code>                </code><code>index = (++index)%</code><code>300</code><code>;  </code>

<code>                </code><code>return</code> <code>buffer;  </code>

<code>        </code><code>}  </code>

<code>        </code><code>// byte[]转换为file的方法  </code>

<code>        </code><code>public</code> <code>static</code> <code>void</code> <code>getFile(</code><code>byte</code><code>[] bfile, String filePath, String fileName) {   </code>

<code>        </code><code>BufferedOutputStream bos = </code><code>null</code><code>;   </code>

<code>        </code><code>FileOutputStream fos = </code><code>null</code><code>;   </code>

<code>        </code><code>File file = </code><code>null</code><code>;   </code>

<code>        </code><code>try</code> <code>{   </code>

<code>            </code><code>File dir = </code><code>new</code> <code>File(filePath);   </code>

<code>            </code><code>if</code><code>(!dir.exists() &amp;&amp; dir.isDirectory()){</code><code>//判断文件目录是否存在   </code>

<code>                </code><code>dir.mkdirs();   </code>

<code>            </code><code>}   </code>

<code>            </code><code>file = </code><code>new</code> <code>File(filePath+</code><code>"\\"</code><code>+fileName);   </code>

<code>            </code><code>fos = </code><code>new</code> <code>FileOutputStream(file);   </code>

<code>            </code><code>bos = </code><code>new</code> <code>BufferedOutputStream(fos);   </code>

<code>            </code><code>bos.write(bfile);   </code>

<code>        </code><code>} </code><code>catch</code> <code>(Exception e) {   </code>

<code>            </code><code>e.printStackTrace();   </code>

<code>        </code><code>} </code><code>finally</code> <code>{   </code>

<code>            </code><code>if</code> <code>(bos != </code><code>null</code><code>) {   </code>

<code>                </code><code>try</code> <code>{   </code>

<code>                    </code><code>bos.close();   </code>

<code>                </code><code>} </code><code>catch</code> <code>(IOException e1) {   </code>

<code>                    </code><code>e1.printStackTrace();   </code>

<code>                </code><code>}   </code>

<code>            </code><code>if</code> <code>(fos != </code><code>null</code><code>) {   </code>

<code>                    </code><code>fos.close();   </code>

<code>        </code><code>}   </code>

<code>    </code><code>}  </code>

<code>}  </code>

<code>//用jna调用本地方法的必须步骤,具体含义不明  </code>

<code>interface</code> <code>WltRS </code><code>extends</code> <code>Library{  </code>

<code>        </code><code>//定义要调用的本地方法  </code>

<code>        </code><code>void</code> <code>GetBmp(String str, </code><code>int</code> <code>i);  </code>

<code>}</code>

 将编译后的BinaryImage.class、WltRS.class根据包名拷贝至报表工程如报表安装目录下的WebReport\WEB-INF\classes\com\FineReport\function\文件夹下。

3、使用自定义函数

将OLE类型字段的值显示为图片。启动设计器,点击服务器&gt;函数管理器,新增自定义函数BINARYIMAGE,选择com.FineReport.function.BinaryImage类:

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

 将身份证读卡器写入Access数据库OLE型字段的照片信息拖入单元格,双击,在数据列&gt;高级&gt;自定义显示中使用自定义函数转换成图片:

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

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