Java一个工具类实现PDF加水印
前言
最近公司做一个需求,给用户上传的文件word和pdf文件进行添加水印,若是doc、docx文件先进行word转pdf然后加水印,如果是pdf文件直接进行加水印。
word转pdf以前服务已经实现了直接复用代码,pdf添加水印通过itextpdf可以直接使用,本文仅做备忘。
使用步骤
一、导入依赖
<!-- 对PDF文件的操作 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.1</version>
</dependency>
<!-- PDF文件 字体 防止中文乱码 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
二、工具类代码
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.*;
import org.apache.commons.io.IOUtils;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
/**
* WatermarkUtils
* PDF添加水印工具类
*
* @author Lcry
*/
public class WaterMarkUtils {
public static final String DEFAULT_WATERMARK_TEXT = "绝密资料";
/**
* pdf添加水印
*
* @param waterMarkText 水印文字
* @param pdfFileBytes pdf
* @param outputFilePath 输出流
*/
public static void addWaterMark(String waterMarkText, byte[] pdfFileBytes, OutputStream outputFilePath) {
try {
// 原PDF文件
PdfReader reader = new PdfReader(pdfFileBytes);
// 输出的PDF文件内容
PdfStamper stamper = new PdfStamper(reader, outputFilePath);
// 字体 来源于 itext-asian jar包
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", true);
PdfGState gs = new PdfGState();
// 设置透明度
gs.setFillOpacity(0.2f);
gs.setStrokeOpacity(0.3f);
int totalPage = reader.getNumberOfPages() + 1;
for (int i = 1; i < totalPage; i++) {
// 内容上层
PdfContentByte content = stamper.getOverContent(i);
content.beginText();
// 字体添加透明度
content.setGState(gs);
// 添加字体大小等
content.setFontAndSize(baseFont, 170);
// 添加范围
content.showTextAligned(Element.ALIGN_BOTTOM, Optional.ofNullable(waterMarkText).orElse(""), 100, 100, 45);
content.endText();
}
// 关闭
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、测试
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\lcry\\Downloads\\2021sj.pdf");
addWaterMark("保密资料", IOUtils.toByteArray(fileInputStream), Files.newOutputStream(Paths.get("C:\\Users\\lcry\\Downloads\\2021sj-mark.pdf")));
}
效果预览
未加水印效果:
加水印后效果:
参考文章
商业转载请联系作者获得授权,非商业转载请注明本文出处及文章链接