背景水印功能说明与开发指引
功能说明
DataViz 提供了背景水印功能以在图表、图册、分析等资源在展现或导出为特定格式文件时,以水印背景形式显示所需的相关信息,以达到记录或展现额外特定信息,保护分析结果被正确使用的作用。
水印效果示例
使用方法
DataViz中提供的默认水印实现会提供访问用户名,访问IP,访问时间信息的显示。具体配置是在后端 WEB-INF/conf/applicationContext.xml 中,配置一个水印生成类:(默认发布版本中该行已被注释)
<bean class="com.neusoft.saca.dataviz.charting.service.watermark.impl.DefaultWatermarkGenerator"></bean>
默认配置下,显示的信息会以逆时针30度旋转、灰色文字、白色透明背景、等宽16号字体、文字加粗、2倍行间距间隔、平铺铺满显示,这里除最后一项显示方式及背景色,其他样式都可以在配置文件中直接修改:
<bean
class="com.neusoft.saca.dataviz.charting.service.watermark.impl.DefaultWatermarkGenerator">
<property name="rotateDegree" value="-40.0"></property>
<property name="font">
<bean class="java.awt.Font">
<constructor-arg index="0" value="Helvetica" />
<constructor-arg index="1" value="1" />
<constructor-arg index="2" value="16" />
</bean>
</property>
<property name="fgColor">
<bean class="java.awt.Color">
<constructor-arg index="0" type="int" value="0" />
<constructor-arg index="1" type="int" value="0" />
<constructor-arg index="2" type="int" value="225" />
</bean>
</property>
<property name="leadingFactor" value="1.5"/>
</bean>
以上配置中,修改了旋转角度为逆时针旋转40度,字体为16号Helvetica字体、加粗,文字颜色为蓝色(RGB 0, 0, 225),行间距为1.5倍间距。
开发指引
当需水印显示的内容或样式配置不能满足要求时,可以通过二次开发接口进行扩展修改。开发所需的接口或实现类位于 dataviz-charting.jar。
简单内容修改
简单的内容修改可以自定义开发一个实现类,替代默认的 DefaultWatermarkGenerator bean替换到 applicationContext.xml中。代码实现可以简单地继承DefaultWatermarkGenerator,重写其中的一个方法:
protected List<String> getTexts(WatermarkContext context) {
...
}
该方法的输入是一个WatermarkContext,一个包含了当前信息的对象,返回值是若干行文字。
WatermarkContext 是一个Map容器,可以调用其 get()
方法,从中获取当前用户等相关信息:
package com.neusoft.saca.dataviz.charting.service.watermark;
public class WatermarkContext {
public static final String KEY_USER_ID = "userId";
public static final String KEY_TIMESTAMP = "timestamp";
public static final String KEY_USER_IP = "userIp";
public static final String KEY_VIEW_TYPE = "viewType";
public <T> T get(String key);
public void put(String key, Object value);
}
其中,viewType是当前的查看方式,包含html、pdf、print等。
其他修改
如果需要的水印通过样式配置和简单的重写无法满足,则需要实现完整的水印生成接口(或抽象类),并在 applicationContext.xml 中替换 defaultWatermarkGenerator bean。
水印生成顶层接口
顶层接口是DataViz中调用水印时使用的接口,通常实现时可以直接使用下层抽象类简化实现。
public interface WatermarkGenerator {
public static final int POSITION_TILE = 1;
public static final int POSITION_CENTER = 2;
public static final int POSITION_ZOOM = 3;
public WatermarkRawImage getWatermarkRawImage(WatermarkContext context, Dimension size);
public WatermarkImageStream getWatermarkImageStream(WatermarkContext context, Dimension size);
public int getPosition(WatermarkContext context, Dimension size);
}
水印生成抽象类
可以直接继承系统中的 com.neusoft.saca.dataviz.charting.service.watermark.impl.AbstractWatermarkGenerator
实现自定义的水印现实效果,需要实现如下2个方法:
/**
* 获取水印图像
*
* @param context
* @param size
* @return
*/
protected abstract ConvertableWatermarkImage getWatermarkImage(WatermarkContext context, Dimension size);
/**
* 生成图片所需的摆放方式,见 POSITION 常量。
*
* @param context
* @param size
* @return
*/
public int getPosition(WatermarkContext context, Dimension size);
其中,WatermarkContext 参见前文介绍,Dimension包含一个宽度和一个高度,它是在导出时文档中的尺寸,可供实现时参考,在展现时该值为null
。
ConvertableWatermarkImage
ConvertableWatermarkImage 是水印图像结果的封装,包含2个构造方法,对应不同的图片获取方式:
public ConvertableWatermarkImage(BufferedImage image)
public ConvertableWatermarkImage(InputStream in, String type)
第一种方式传入一个 java.awt.image.BufferedImage
对象,较适用与JVM内存中动态生成图片的场景;第二种方式传入一个输入流和类型,输入流是一个图像文件流,type指定其格式(建议使用 png 或 jpg),较使用于从其他方式获取图像场景。