碰到一个证书颁发的需求,要求是啥呢,提供一个模板,给模板填充文字。
这个需求其实也很常见,java.awt
中的Graphics2D
就可以完成我目前所有的需求。
例如:填充图片文字(不损失模板帧数的前提下)、给文字设置字体大小、设置字体颜色等
Graphics2D
统统可以实现。
Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一Graphics2D
类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。
Graphics2D
定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。图形状态属性用特定的对象储存。
当然了Graphics2D
的功能不止于此,如果有类似的需求也可以仔细研究一下。
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @author King<fsyvip666 @ gmail.com>
* @date 2022年06月10日 13:38
*/
@Component
public class PictureWriteUtil {
private static final Logger log = LoggerFactory.getLogger(InvoicingHttpsUtils.class);
/**
* 写入图像内容
*
* @param pictureInfos :输入图片信息
* @param filePath :文件绝对路径
* @return java.awt.image.BufferedImage
* @author king<fsyvip666 @ gmail.com>
* @date 2022/6/10 14:29
*/
public static BufferedImage modifyImage(String filePath, List<PictureBo> pictureInfos) throws IOException {
BufferedImage read = ImageIO.read(new File(filePath));
if (null != read && null != pictureInfos) {
//创建图形
pictureInfos.forEach(info -> {
Graphics2D finalGraphics2D = read.createGraphics();
//设置字体颜色
finalGraphics2D.setColor(new Color(3, 3, 3));
//设置字体
finalGraphics2D.setFont(new Font("黑体", Font.PLAIN, 20));
//写入内容
finalGraphics2D.drawString(info.getContent(), info.getRowAxis(), info.getVerticalAxis());
//完成模板修改
finalGraphics2D.dispose();
});
}
return read;
}
/**
* 把缓存图片先上传到本地随后上传oss
*
* @param image:缓存图片
* @param filePath:绝对本地路径
* @param suffix:文件后缀
* @param userId:用户id
* @return java.long.String : oss连接
* @author king<fsyvip666 @ gmail.com>
* @date 2022/6/10 14:35
*/
public static String writeFileToOss(String filePath, BufferedImage image, String suffix, Long userId) throws IOException {
String endPath = "user/" + userId;
String oss = "";
if (StringUtils.isNotEmpty(filePath) && null != image) {
File file = new File(filePath);
ImageIO.write(image, suffix, file);
//根据filePath上传oss,然后拿到oss连接
oss = StorageUtil.uploadFile(endPath, file);
log.info("上传oss成功删除本地文件:{}", file.delete());
}
return oss;
}
}
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author King<fsyvip666 @ gmail.com>
* @date 2022年06月10日 13:38
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public class PictureBo {
/**
* 写入内容
*/
private String content;
/**
* 图片x轴
*/
private Integer rowAxis;
/**
* 图片y轴
*/
private Integer verticalAxis;
/**
* 类型:名字、日期、编号
*/
private String type;
/**
* 手机号
*/
private String phone;
}
因为写入图片内容是根据坐标写入的,所以要定义图片的坐标点写入内容。
具体业务我就不过多展示了。贴一下稍微复杂一点的业务处理吧。
效果图
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。