1.图片加水印
package com.demo.util;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.Date;
/**
* Description: 图片水印工具类
* @version 1.0
*/
public class ImageRemarkUtil {
// 水印透明度
private static float alpha = 0.5f;
// 水印文字字体
private static Font font = new Font("宋体", Font.BOLD, 20);
// 水印文字颜色
private static Color color = Color.gray;
/**
* 给图片添加水印文字、可设置水印文字的旋转角度
*
* @param logoText
* @param srcImgPath
* @param targerPath
* @param degree
*/
public static void markImageByText(String logoText, String srcImgPath,String imgType,
String targerPath, Integer degree) {
InputStream is = null;
OutputStream os = null;
try {
// 1、源图片
URL urlfile = new URL(srcImgPath);
Image srcImg = ImageIO.read(urlfile);
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
setImage(buffImg,srcImg,degree,logoText);
// 10、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, imgType, os);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != is)
is.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 给图片添加水印文字、可设置水印文字的旋转角度
*
* @param logoText
* @param srcImgPath
* @param is
* @param degree
*/
public static InputStream markImageByText(String logoText, String srcImgPath,String imgType,
InputStream is, Integer degree) {
try {
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut;
imOut = ImageIO.createImageOutputStream(bs);
// 1、源图片
URL urlfile = new URL(srcImgPath);
Image srcImg = ImageIO.read(urlfile);
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
setImage(buffImg,srcImg,degree,logoText);
// 10、生成图片
ImageIO.write(buffImg, imgType, imOut);
is = new ByteArrayInputStream(bs.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return is;
}
private static void setImage(BufferedImage buffImg, Image srcImg,Integer degree,String logoText){
// 2、得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 3、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null),
srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
null);
// 4、设置水印旋转
if (null != degree) {
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2,
(double) buffImg.getHeight() / 2);
}
// 5、设置水印文字颜色
g.setColor(color);
// 6、设置水印文字Font
g.setFont(font);
// 7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
for (int i = 0; i < buffImg.getHeight() / 120; i++) {
for (int j = 0; j < buffImg.getWidth() / 50; j++) {
g.drawString(logoText, i * 300, j * 200);
}
}
// 9、释放资源
g.dispose();
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int finalI = i;
ThreadUtils.execute(() -> test(finalI));
}
}
public static void test(int i){
System.out.println("第"+i+"张图片添加水印文字开始... "+ new Date());
String srcImgPath = "https://c-ssl.duitang.com/uploads/item/202006/24/20200624135159_zcwoi.jpg";
String logoText = "复印无效";
String targerTextPath2 = "D:/image/AAb"+i+".jpg";
// 给图片添加水印文字,水印文字旋转-45
markImageByText(logoText, srcImgPath,"jpg", targerTextPath2, -45);
System.out.println("第"+i+"张图片添加水印文字结束... "+new Date());
}
}
2.pdf加水印
引入依赖
<!-- pdf加水印 start -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- pdf加水印 end -->
package com.demo.util;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.Date;
public class PdfRemarkUtil {
public static void main(String[] args) throws DocumentException, IOException {
for (int i = 0; i < 10; i++) {
int finalI = i;
ThreadUtils.execute(() -> test(finalI));
}
}
private static void test(int i){
// 将pdf文件先加水印然后输出
System.out.println("第"+i+"张pdf开始加水印"+new Date());
try {
setWatermarkByUrl("网址.pdf","D:/image/"+i+".pdf", "测试水印");
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("第"+i+"张pdf结束加水印"+new Date());
}
/**
*
* @param output
* @param input
* 原PDF位置
* @param waterMarkName
* 页脚添加水印
* @throws DocumentException
* @throws IOException
*/
public static void setWatermark(String input,String output, String waterMarkName)
throws DocumentException, IOException {
PdfReader reader = new PdfReader(input);
PdfReader.unethicalreading = true;
//PdfStamper stamper = new PdfStamper(reader, bos);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
output));
setPdf(reader,stamper,waterMarkName);
}
private static void setPdf(PdfReader reader,PdfStamper stamper, String waterMarkName ) throws IOException, DocumentException {
try {
// 获取总页数 +1, 下面从1开始遍历
int total = reader.getNumberOfPages() + 1;
// 使用classpath下面的字体库
BaseFont base = null;
try {
base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
// 日志处理
e.printStackTrace();
}
// 获取水印文字的高度和宽度
int textH = 0, textW = 0;
JLabel label = new JLabel();
label.setText(waterMarkName);
FontMetrics metrics = label.getFontMetrics(label.getFont());
textH = metrics.getHeight();
textW = metrics.stringWidth(label.getText());
// 设置水印透明度
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.4f);
gs.setStrokeOpacity(0.4f);
Rectangle pageSizeWithRotation = null;
PdfContentByte content = null;
for (int i = 1; i < total; i++) {
// 在内容上方加水印
content = stamper.getOverContent(i);
// 在内容下方加水印
// content = stamper.getUnderContent(i);
content.saveState();
content.setGState(gs);
// 设置字体和字体大小
content.beginText();
content.setFontAndSize(base, 20);
// 获取每一页的高度、宽度
pageSizeWithRotation = reader.getPageSizeWithRotation(i);
float pageHeight = pageSizeWithRotation.getHeight();
float pageWidth = pageSizeWithRotation.getWidth();
// 根据纸张大小多次添加, 水印文字成45度角倾斜
for (int k = 0; k < pageHeight / 120; k++) {
for (int j = 0; j < pageWidth / 50; j++) {
content.showTextAligned(Element.ALIGN_LEFT, waterMarkName, k * 120+textW, j * 150+textH, 45);
}
}
content.endText();
}
}catch (Exception e){
e.printStackTrace();
}finally {
// 关流
stamper.close();
reader.close();
}
}
public static void setWatermarkByUrl(String inputUrl,String output, String waterMarkName)
throws DocumentException, IOException {
URL urlfile = new URL(inputUrl);
PdfReader reader = new PdfReader(urlfile);
PdfReader.unethicalreading = true;
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
output));
setPdf(reader,stamper,waterMarkName);
}
public static InputStream setWatermarkByUrlAndOutputStream(String inputUrl, InputStream inputStream, String waterMarkName)
throws DocumentException, IOException {
URL urlfile = new URL(inputUrl);
PdfReader reader = new PdfReader(urlfile);
PdfReader.unethicalreading = true;
ByteArrayOutputStream bs = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, bs);
setPdf(reader,stamper,waterMarkName);
inputStream = new ByteArrayInputStream(bs.toByteArray());
return inputStream;
}
}