-1.示意图
0、maven依赖
<!--word excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.0</version>
</dependency>
<!-- 对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>
一、给word添加斜体水印
package com.example.pdfshuiying.word;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlObject;
import javax.xml.namespace.QName;
import java.io.*;
import java.util.regex.Pattern;
public class WordUtil {
/**
* word文件添加文字水印
*
* @param fileData 原始文件字节数组
* @param outputSrc 文件输出路径
* @param waterMarkName 水印内容
*/
public static void addWordWaterMark(byte[] fileData, String outputSrc, String waterMarkName) throws Exception {
InputStream input = new ByteArrayInputStream(fileData);
XWPFDocument doc = new XWPFDocument(input);
XWPFHeaderFooterPolicy headerFooterPolicy = doc.createHeaderFooterPolicy();
//添加文字水印
headerFooterPolicy.createWatermark(waterMarkName);
XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);
XWPFParagraph paragraph = header.getParagraphArray(0);
paragraph.getCTP().newCursor();
XmlObject[] xmlobjects = paragraph.getCTP().getRArray(0).getPictArray(0).selectChildren(new QName("urn:schemas-microsoft-com:vml", "shape"));
if (xmlobjects.length > 0) {
com.microsoft.schemas.vml.CTShape ctshape = (com.microsoft.schemas.vml.CTShape) xmlobjects[0];
//设置水印颜色
ctshape.setFillcolor("#404040");
//修改水印样式 //设置水印的样式 获取默认样式和旋315度
ctshape.setStyle(getWaterMarkStyle(ctshape.getStyle(), 23) + ";rotation:315");
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
doc.write(out);
} finally {
out.close();
doc.close();
input.close();
}
out.writeTo(new BufferedOutputStream(new FileOutputStream(outputSrc)));
}
/**
* 设置水印格式
* word
*
* @param styleStr
* @param height
* @return
*/
public static String getWaterMarkStyle(String styleStr, double height) {
Pattern p = Pattern.compile(";");
String[] strs = p.split(styleStr);
for (String str : strs) {
if (str.startsWith("height:")) {
String heightStr = "height:" + height + "pt";
styleStr = styleStr.replace(str, heightStr);
break;
}
}
return styleStr;
}
public static void main(String[] args) throws Exception {
String y="C:\\Users\\zhyyds\\Desktop\\ik\\test.doc";
String x="C:\\Users\\zhyyds\\Desktop\\ik\\test1.doc";
String text="ask创作 2022-06-12 23:37:56";
File file = new File(y);
byte[] bytes = FileUtils.readFileToByteArray(file);
WordUtil.addWordWaterMark(bytes,x,text);
}
}
二、给pdf添加斜体水印
package com.example.pdfshuiying.pdf;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import java.io.FileOutputStream;
public class PdfUtil {
public static void main(String[] args) {
/**1.源文件地址
* 2.出参地址
* 3.水印文字*/
PdfUtil.addWaterMark2("C:\\Users\\zhyyds\\Desktop\\ik\\1.pdf", "C:\\Users\\zhyyds\\Desktop\\ik\\2.pdf"
, "ask 创造");
}
/**
* @param inputFile
* @param outputFile
* @param text
*/
//pdf格式 动态 xy坐标轴 斜体居中
public static void addWaterMark2(String inputFile, String outputFile, String text) {
try {
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
//这里的字体设置比较关键,这个设置是支持中文的写法
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 使用系统字体
int total = reader.getNumberOfPages() + 1;
PdfContentByte under;
Rectangle pageRect = null;
for (int i = 1; i < total; i++) {
pageRect = stamper.getReader().getPageSizeWithRotation(i);
// 计算水印X,Y坐标
float x = pageRect.getWidth() / 2;
float y = pageRect.getHeight() / 2;
// 获得PDF最顶层
under = stamper.getOverContent(i);
under.saveState();
// set Transparency
PdfGState gs = new PdfGState();
// 设置透明度为0.8
gs.setFillOpacity(0.8f);
under.setGState(gs);
under.beginText();
under.setFontAndSize(base, 40);
under.setColorFill(BaseColor.GRAY);
// 水印文字成45度角倾斜
under.showTextAligned(Element.ALIGN_CENTER, text, x, y, 45);
// 添加水印文字
under.endText();
under.setLineWidth(1f);
under.stroke();
under.restoreState();
}
stamper.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、给excel添加斜体水印
package com.example.pdfshuiying.excel;
import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
public class news0613 {
public static void main(String[] args) throws Exception {
//图片水印 1.图片存放路径 2.水印文字 3.图片类型
new news0613().addWatermark("C:\\Users\\zhyyds\\Desktop\\ik\\test\\watermarkImg.png", "ask创作 2022-06-12 23:37:56", "png");
//放置excel里 1.原地址 2.新存放地址 3.图片地址
new news0613().addWatermarkExcel(
"C:\\Users\\zhyyds\\Desktop\\ik\\test\\1.xlsx",
"C:\\Users\\zhyyds\\Desktop\\ik\\test\\5.xlsx",
"C:\\Users\\zhyyds\\Desktop\\ik\\test\\watermarkImg.png"
);
}
/**
* @param in 原路径
* @param out 放置路径
* @param img 图片路径
*/
private void addWatermarkExcel(String in, String out, String img) throws Exception {
try (FileOutputStream fileOutputStream = new FileOutputStream(new File(out));
InputStream image = new FileInputStream(img);
XSSFWorkbook workbook = new XSSFWorkbook(in);) {
int pictureIdx = workbook.addPicture(image, Workbook.PICTURE_TYPE_PNG);
POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表
XSSFSheet sheet = workbook.getSheetAt(i);
PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
String relType = XSSFRelation.IMAGES.getRelation();
//add relation from sheet to the picture data
PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
//set background picture to sheet
sheet.getCTWorksheet().addNewPicture().setId(pr.getId());
}
workbook.write(fileOutputStream);
} catch (Exception e) {
System.out.println("e" + e);
}
}
/**
* @param tarImgPath 保存的图片路径
* @param waterMarkContent 水印内容
* @param fileExt 图片格式
* @return void
* @description
*/
public void addWatermark(String tarImgPath, String waterMarkContent, String fileExt) {
//1.创建白色背景板空白图片
int blankWidth = 1000, blankHeight = 600;// 设置背景宽高.
BufferedImage bufImg = new BufferedImage(blankWidth, blankHeight, BufferedImage.TYPE_INT_RGB);
Graphics graphics = bufImg.getGraphics();// 获取图形上下文对象
graphics.fillRect(0, 0, blankWidth, blankHeight);// 填充
graphics.fillRect(0, 0, blankWidth, blankHeight);// 填充
graphics.dispose();// 释放资源
//2.设置水印基本信息
Font font = new Font("#404040", Font.BOLD, 34);//水印字体,大小
Color markContentColor = Color.GRAY;//水印颜色
Integer degree = -45;//设置水印文字的旋转角度
float alpha = 0.6f;//设置水印透明度 默认为1.0 值越小颜色越浅
try (OutputStream outImgStream = new FileOutputStream(tarImgPath);) {
// 加水印
Graphics2D g = bufImg.createGraphics();//得到画笔
g.setColor(markContentColor); //设置水印颜色
g.setFont(font); //设置字体
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
g.rotate(Math.toRadians(degree), (double) bufImg.getWidth(), (double) bufImg.getHeight());//设置水印旋转
JLabel label = new JLabel(waterMarkContent);
FontMetrics metrics = label.getFontMetrics(font);
int width = metrics.stringWidth(label.getText());//文字水印的宽
g.drawString(waterMarkContent, 510, -100);
g.dispose();// 释放资源
// 输出图片
ImageIO.write(bufImg, fileExt, outImgStream);
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
}
}
}