在UReport2当中,选中目标单元格,点击工具栏上的插入图片按钮,就可以插入图片,如下图所示:
插入图片后,默认只显示图片的示意图,这是因为我们要加载的图片可以是静态的,也可以是动态的,所以报表模版中以示意图的形式显示。选中图片所在单元格就可以在属性窗口中设置图片相关属性,可以看到,对于图片的来源来说,有两个选项,如下表所示:
图片来源 | 说明 |
---|---|
路径 | 也就是指定图片来源为一个固定的路径,UReport2默认支持以classpath:开头位于classpath下的图片文件,或以/开头位于WEB应用根下或某目录下的图片文件 |
表达式 | 通过表达式动态为图片指定一个路径,如:emp.select(photo),表达从数据集emp中取现photo属性值作为图片路径,这里需要注意的是,最终计算取到的值对应的图片路径,也要符合默认的以classpath:开头,或以/开头,如果需要取存储在其它位置的图片,我们可以通过实现ImageProvider接口实现,比如取存储在数据库中的图片等。 |
ImageProvider接口
前面介绍了,UReport2默认只支持以classpath:开头,或以/开头存储在文件系统里的文件,如果我们需要取其它位置的图片,比如取存储在数据库中的图片,可以通过实现ImageProvider接口实现,该接口源码如下:
ImageProvider接口源码
package com.bstek.ureport.provider.image; import java.io.InputStream; /** * @author Jacky.gao * @since 2017年3月6日 */ public interface ImageProvider { InputStream getImage(String path); boolean support(String path); }
在实现该接口时,我们需要为新的图片路径定义一个前缀,比如存储到数据库中我们可以以db:作为前缀,比如:db:001,表示存储在数据库中,ID为001的图片,具体实现方式可以参照UReport2中提供的默认的支持classpath:和/前缀的ImageProvider实现类,默认的ImageProvider接口实现类源码如下:
UReport2默认的ImageProvider接口实现类源码
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.util.ResourceUtils; import org.springframework.web.context.WebApplicationContext; import com.bstek.ureport.exception.ReportComputeException; /** * @author Jacky.gao * @since 2017年3月6日 */ public class DefaultImageProvider implements ImageProvider,ApplicationContextAware { private ApplicationContext applicationContext; private String baseWebPath; @Override public InputStream getImage(String path) { try { if(path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX) || path.startsWith("/WEB-INF")){ return applicationContext.getResource(path).getInputStream(); }else{ path=baseWebPath+path; return new FileInputStream(path); } } catch (IOException e) { throw new ReportComputeException(e); } } @Override public boolean support(String path) { if(path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)){ return true; }else if(baseWebPath!=null && (path.startsWith("/") || path.startsWith("/WEB-INF"))){ return true; } return false; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(applicationContext instanceof WebApplicationContext){ WebApplicationContext context=(WebApplicationContext)applicationContext; baseWebPath=context.getServletContext().getRealPath("/"); } this.applicationContext=applicationContext; } }
ImageProvider接口实现类定义完成后,我们只需要将其配置到Spring上下文中,UReport2会自动检测到并加载,这样通过自已实现ImageProvider接口,就可以加载任意位置的图片。