由于业务需求,文字水印无法满足,需要把文字转化成图片,并加在pdf中生成图片水印
示例:
package com.chinaunicom.api.utils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
/**
* @Author zhangyy
* @Date 2021/8/23 19:04
*/
public class FontImage {
private final static BasicStroke stokeLine = new BasicStroke( 2.0f );
public static void main(String[] args) throws Exception {
createImage("此件与原件相符,仅供:xxx过程中使用。再复印无效", new File("g:/a.png"));
}
/**
* 根据str,font的样式以及输出文件目录
* @param str 字符串
* @param outFile 输出文件位置
* @throws Exception
*/
public static void createImage(String str, File outFile) throws Exception {
Font font=new Font("宋体", Font.BOLD, 30);
Integer width=490;
Integer height=150;
// 创建图片
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();
g.setClip(0, 0, width, height);
//g.setColor(Color.white);
// 先用黑色填充整张图片,也就是背景
g.fillRect(0, 0, width, height);
g.setColor(Color.blue);
// 设置画笔字体
g.setFont(font);
Graphics2D g2d = (Graphics2D)g;
g2d.setStroke(stokeLine);
/** 用于获得垂直居中y */
Rectangle clip = g.getClipBounds();
FontMetrics fm = g.getFontMetrics(font);
int ascent = fm.getAscent();
int descent = fm.getDescent();
int y = (clip.height - (ascent + descent)) / 2 + ascent;
// 256 340 0 680
int length=str.length();
int con=length/15;
if (length%15!=0){
con+=1;
}
g.drawLine(0,0,width,0);
g.drawLine(0,0,0,height);
g.drawLine(width,height,width,0);
g.drawLine(width,height,0,height);
for (int i = 0; i <con; i++) {
// 画出字符串
g.drawString(str.substring(i*15,(i+1)*15>length?length:(i+1)*15), 0, y+(i-1)*40);
}
g.dispose();
// 输出png图片
ImageIO.write(image, "png", outFile);
}
}
效果: