最近项目中使用了word合成,使用了poi-tl 进行处理。但是遇到要渲染一个图片,就一言难尽了。
官网默认的图片渲染结果会占住word的空间大小,导致整体间距会被拉大。
迫不得已,只能实现一个图片渲染的插件来实现图片浮动效果。
1.渲染类
CustomPictureRenderData 是对原poi-tl图片渲染类的扩展,添加了左偏移和上偏移属性。
这两属性用于图片位置的调整。
public class CustomPictureRenderData implements RenderData {
/**
* 图片宽度
*/
private int width;
/**
* 图片高度
*/
private int height;
/**
* 图片路径
*/
private String path;
/**
* 图片二进制数据
*/
private transient byte[] data;
/**
* 当图片不存在时,显示的文字
*/
private String altMeta = "";
/**
* 左偏量
*/
private int leftOffset;
/**
* 上偏移量
*/
private int topOffset;
// 省略get/set/构造等方法
}
2. 自定义渲染策略
PoiPicPolicy定义了具体的渲染方式,在poi-tl的默认渲染方式基础上添加了对样式的处理。
public class PoiPicPolicy extends AbstractRenderPolicy<CustomPictureRenderData> {
@Override
protected boolean validate(CustomPictureRenderData data) {
return (null != data && (null != data.getData() || null != data.getPath()));
}
@Override
protected void afterRender(RenderContext<CustomPictureRenderData> context) {
clearPlaceholder(context, false);
}
@Override
protected void reThrowException(RenderContext<CustomPictureRenderData> context, Exception e) {
logger.info("Render picture {}, error: {}", context.getEleTemplate(),e.getMessage());
context.getRun().setText(context.getData().getAltMeta