现需要给pdf文件添加水印,因为我想将参数动态调整,所以方法是非静态的,参数都是通过配置文件传过来,其次,我需要两种输出方式,一种是文件输出到指定位置,一种是以响应体的形式输出,通过传参的形式解决这个问题,
需要使用到的Maven如下:
<!-- iText,export pdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
代码如下:
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.FileOutputStream;
import java.io.OutputStream;
@Slf4j
@Component
@RefreshScope
public class FileUtil {
@Value("${watermark.textName:合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效 合同条款,手写无效}")
private String textName;
@Value("${watermark.fontSize:9}")
private int fontSize;
@Value("${watermark.rotate:20}")
private int rotate;
@Value("${watermark.opacity:0.3}")
private float opacity;
@Value("${watermark.textX:500}")
private int X;
@Value("${watermark.textY:100}")
private int Y;
@Value("${watermark.position:1}")
private int position;
@Value("${watermark.numberOfPage:10}")
private int numberOfPage;
/**
*
* @param input 输入字节数组
* @param path 文件输出路径
* @param response 文件一流的形式输出
*/
public void waterMarkPdf(byte[] input,String path,HttpServletResponse response) {
log.info("开始对PDF进行添加文字水印--->textName{}",textName);
try {
PdfReader reader = new PdfReader(input);
OutputStream os ;
if (StringUtils.isNotBlank(path)){
os = new FileOutputStream(path);
} else {
os = response.getOutputStream();
}
//最终输出位置
PdfStamper stamper = new PdfStamper(reader, os);
//设置文字样式
com.itextpdf.text.pdf.BaseFont font = com.itextpdf.text.pdf.BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", com.itextpdf.text.pdf.BaseFont.NOT_EMBEDDED);
PdfGState gs = new PdfGState();
//设置透明度
gs.setFillOpacity(opacity);
int total = reader.getNumberOfPages() + 1;
JLabel label = new JLabel();
//设置自定义水印
label.setText(textName);
//得到文字的宽高
PdfContentByte under = null;
for (int i = 1; i < total; i++) {
under = stamper.getOverContent(i);
under.saveState();
under.setGState(gs);
under.beginText();
under.setFontAndSize(font, fontSize);
//numberOfPage 水印条数
for (int j = 0; j < numberOfPage; j++) {
//
/**
* position 左、右、居中(ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT)
* text 要输出的文本
* x文本输入的X坐标 y 文本输入的Y坐标
* rotate 文本的旋转角度
*/
under.showTextAligned(position, textName, X, Y * (j + 1), rotate);
}
// 添加水印文字
under.endText();
}
//关闭流
stamper.close();
os.close();
reader.close();
log.info("pdf添加文字水印结束。");
} catch (Exception e) {
log.error("pdf添加文字水印异常。",e);
}
}
}