前言
本文介绍了java为pdf, word, excel, ppt等文档添加水印的方法, 详见官方文档
正文
效果图
word
注意: wps显示异常, 详见代码注释
ppt
maven依赖
e-iceblue.office仓库
可以直接将jar推送到私服无需引入此仓库
<!-- office水印仓库 -->
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
maven依赖
<!-- pdf水印 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.12</version>
</dependency>
<!-- pdf中文水印支持 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- office水印依赖包 -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.office.free</artifactId>
<version>5.3.1</version>
</dependency>
java代码
main函数里有测试用例
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.HeaderFooter;
import com.spire.doc.Section;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.ShapeLineStyle;
import com.spire.doc.fields.ShapeObject;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.*;
import com.spire.pdf.widget.PdfPageCollection;
import com.spire.presentation.*;
import com.spire.presentation.collections.SlideCollection;
import com.spire.presentation.drawing.FillFormatType;
import com.spire.xls.ViewMode;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import sun.font.FontDesignMetrics;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
/**
* 水印工具类
*
* @author LSL
* @date 2022-07-28 22:54:52
*/
@Slf4j
public class WatermarkUtil {
/**
* 水印相关配置
*/
private static final int FONT_SIZE = 12;
private static final Font FONT = new Font("宋体", Font.PLAIN, FONT_SIZE);
private static final Color FONT_COLOR = new Color(200, 200, 200);
private static final float TEXT_ROTATION = 30;
/**
* 文件类型
*/
interface FileType {
String PDF = "pdf";
String DOC = "doc";
String DOCX = "docx";
String XLS = "xls";
String XLSX = "xlsx";
String PPT = "ppt";
String PPTX = "pptx";
String JPG = "jpg";
String JPEG = "jpeg";
String PNG = "png";
String BMP = "bmp";
}
/**
* word格式映射
*/
private static final Map<String, FileFormat> FILE_FORMAT_WORD_MAP = new HashMap<>();
/**
* ppt格式映射
*/
private static final Map<String, com.spire.presentation.FileFormat> FILE_FORMAT_PPT_MAP = new HashMap<>();
static {
FILE_FORMAT_WORD_MAP.put(FileType.DOC, FileFormat.Doc);
FILE_FORMAT_WORD_MAP.put(FileType.DOCX, FileFormat.Docx_2013);
FILE_FORMAT_PPT_MAP.put(FileType.PPT, com.spire.presentation.FileFormat.PPT);
FILE_FORMAT_PPT_MAP.put(FileType.PPTX, com.spire.presentation.FileFormat.PPTX_2013);
}
/**
* 添加水印
*
* @param inputStream 文件输入流
* @param outputStream 输出流
* @param fileType 文件类型
* @param watermark 水印
*/
public static boolean watermark(InputStream inputStream, OutputStream outputStream, String fileType, String watermark) {
try {
switch (fileType) {
// office
case FileType.PDF:
WatermarkUtil.pdf(inputStream, outputStream, fileType, watermark);
break;
case FileType.DOC:
case FileType.DOCX:
WatermarkUtil.word(inputStream, outputStream, fileType, watermark);
break;
case FileType.XLS:
case FileType.XLSX:
WatermarkUtil.excel(inputStream, outputStream, fileType, watermark);
break;
case FileType.PPT:
case FileType.PPTX:
WatermarkUtil.ppt(inputStream, outputStream, fileType, watermark);
break;
// 图片
case FileType.JPG:
case FileType.JPEG:
case FileType.PNG:
case FileType.BMP:
WatermarkUtil.picture(inputStream, outputStream, fileType, watermark);
break;
// 其他
default:
WatermarkUtil.other(inputStream, outputStream, fileType, watermark);
break;
}
} catch (Exception e) {
log.error(fileType + "水印添加失败", e);
return false;
} finally {
// 释放资源
try {
if (outputStream != null) {
outputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {