历史版本1 :图片在下文字在上 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:
一个图表字段跟一个普通字段希望显示在一个单元格中,有层次的显示出来。例如A字段存着一个图片,B字段存着一些字符串.先把A字段拖入A1单元格,然后再将B字段也拖入A1单元格,背景是A字段,显示的内容是B字段的值,类似于PPT等层的一个关系,如下图效果动物的图片为背景上层显示另一字段产地的值中国。

1. 实现原理编辑

FineReport可以通过自定义函数来实现,定义两个参数name, image分别接收模板中字段,然后返回一个带name的图片,就实现把文字显示在图片之上了。

2. 实现步骤编辑

2.1 编写自定义函数
定义StringImage这个类代码如下:
HTML/XML代码
//图片在下文字在上  
package com.fr.function;  
  
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  
import java.sql.Blob;  
import javax.imageio.ImageIO;  
import javax.swing.JFrame;  
import javax.swing.JPanel;  
import com.fr.base.BaseUtils;  
import com.fr.base.GraphHelper;  
import com.fr.script.AbstractFunction;  
import com.fr.stable.CoreGraphHelper;  
  
  
public class StringImage extends AbstractFunction {  
    public Object run(Object[] args) {  
        Image result = null;  
        int p = 0;  
        Object[] ob = new Object[2];  
        for (int i = 0; (i < args.length && p <= 1); i++) {  
            if (args[i] == null) {  
                continue;  
            }  
            ob[p] = args[i];  
            p++;  
  
        }  
        try {  
            result = initStringImage(ob[0], ob[1]);  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return result;  
    }  
  
    public Image initStringImage(Object nameOb, Object imageOb)  
            throws IOException {  
        String name = (String) nameOb;  
        Image image = null;  
        if (imageOb instanceof Image)  
            image = (Image) imageOb;  
        else  
            ;  
        Image stringImage = null;  
        BufferedImage splashBuffedImage = CoreGraphHelper.toBufferedImage(image);  
        stringImage = splashBuffedImage;  
        Graphics2D splashG2d = splashBuffedImage.createGraphics();  
        double centerX = 25;  
        double centerY = 25;  
        GraphHelper.drawString(splashG2d, name, centerX, centerY);  
        //    
        String FilePath = "Test.png";  
        File f = new File(FilePath);  
        ImageIO.write(splashBuffedImage, "png", f);  
        //    
        return splashBuffedImage;  
    }  
  
    public static void main(String arg[]) throws IOException {  
        StringImage tt = new StringImage();  
        Image image = BaseUtils.readImage("D:\\1.jpg");  
        String name = "12314124";  
        Image aa = tt.initStringImage(name, image);  
        JFrame jf = new JFrame();  
        JPanel jp = new JPanel();  
  
    }  
}  
注:最新的代码链接fine-help
2.2 编译自定义函数
将编译后的StringImage.class放到FineReport的安装目录WEB-INF下面的classes目录下,因为StringImage.java属于包com.fr.function,所以StringImage.class需要放到classes\com\fr\function目录下。
2.3 注册自定义函数
生成该函数的类后需要在设计器中进行注册,才可以使用该函数。打开服务器|函数管理器,选择刚刚定义好了StringImage类,如下图
函数名称可以自定义,如这边定义为img;同时可以添加该函数的使用说明,如上图所示的描述。
2.4 使用自定义函数

注册好自定义函数后,制作报表时便可直接使用了,在A1单元格拖入图片字段,选择高级|自定义显示|值里面输入公式StringImage(字符串B,图片A),例如:StringImage("中国",$$$),保存模板预览就可以实现图片在下文字在上的效果了。