package com.xuebusi.toutiao.admin.api.common.util;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.*;

import java.io.*;

public class WaterMarkUtils {
/**
* PDF附件添加二维码
*
* @param bos 输出文件的位置
* @param input 输入文件流
* @author nicky.ma
* @date 2019年6月11日下午3:42:15
*/
public static void setQrCodeForPDF(BufferedOutputStream bos, InputStream input) {
try {
// 创建水印图片
BarcodeQRCode barcodeQRCode = new BarcodeQRCode("https://sina.cn", 100, 100, null);
com.itextpdf.text.Image iTextImage = barcodeQRCode.getImage();
// 水印图片位置
iTextImage.setAbsolutePosition(10, 740);
// 边框固定
// iTextImage.scaleToFit(200, 200);
// 设置旋转弧度
//image.setRotation(30);// 旋转 弧度
// 设置旋转角度
// iTextImage.setRotationDegrees(45);
// 设置等比缩放
iTextImage.scalePercent(80);
// 自定义大小
iTextImage.scaleAbsolute(100, 100);
//PDF附件加上二维码水印
setWatermarkForPDF(bos, input, iTextImage);
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}

/**
* 为PDF附件添加图片水印
*
* @param bos 输出文件的位置
* @param input 输入文件流
* @author nicky.ma
* @date 2019/6/11 12:00:32
*/
public static void setWatermarkForPDF(BufferedOutputStream bos, InputStream input, Image iTextImage)
throws IOException, DocumentException {
PdfReader reader = new PdfReader(input);
PdfStamper stamper = new PdfStamper(reader, bos);
int total = reader.getNumberOfPages() + 1;
PdfContentByte waterMar;

PdfGState gs = new PdfGState();
long startTime = System.currentTimeMillis();
System.out.println("PDF加图片水印 start");
for (int i = 1; i < total; i++) {
// waterMar = stamper.getOverContent(i);// 在内容上方加水印
waterMar = stamper.getUnderContent(1);//在内容下方加水印
// 设置图片透明度为0.2f
//gs.setFillOpacity(0.2f);
// 设置笔触字体不透明度为0.4f
//gs.setStrokeOpacity(0.4f);
// 开始水印处理
waterMar.beginText();
// 设置透明度
waterMar.setGState(gs);
// 设置水印字体参数及大小
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
waterMar.setFontAndSize(bf, 12);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
waterMar.showTextAligned(Element.ALIGN_CENTER, "存证证书", 60, 725, 0);
// 设置水印颜色
waterMar.setColorFill(BaseColor.GRAY);
// 附件加上水印图片
waterMar.addImage(iTextImage);
// 完成水印添加
waterMar.endText();
// stroke
waterMar.stroke();
}
long endTime = System.currentTimeMillis();
System.out.println("PDF加图片水印 ok 所用时间:" + (endTime - startTime) + "s");
stamper.close();
reader.close();
}

public static void main(String[] args) throws FileNotFoundException {
FileInputStream inputStream = new FileInputStream(new File("D:\\2021-07-29.pdf"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\20210729.pdf"));
WaterMarkUtils.setQrCodeForPDF(bos, inputStream);
}
}