最近写的项目需要实现给PDF文件增添水印的功能(不想把用户上传的PDF在再次下载的时候还是原文件,增添水印可以增加文件的保密性,),我们使用itextpdf实现这个功能,
// 创建文件
Document document = new Document();
document.setPageSize(PageSize.A4);
// 建立一个书写器
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(oldPath));
// 打开文件
document.open();
导入依赖
<!--PDF工具包-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.5</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- pdf转图片 -->
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>6.1.2</version>
</dependency>
控制层代码:
@PostMapping("/exportPdf")
public void exportPdf(@RequestBody MyDrawingChangeVO vo) throws Exception {
//数据库中获取对象
MyDrawingChangePdfElement pdfElement = selfBiz.getExportPdfElement(vo);
//文件名
String fileName = "变更单" + pdfElement.getSerialNumber() + ".pdf";
//生成文件
response.setContentType("application/pdf");
response.setCharacterEncoding("utf-8");
String endFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + endFileName);
DrawingPDFUtils.createHardwarePDF(response, pdfElement);
}
业务层代码
package com.muyuan.platform.slaughter.building.utils;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.muyuan.platform.common.util.CollectionUtil;
import com.muyuan.platform.slaughter.building.entity.drawing.MyDrawingChangeDetail;
import com.muyuan.platform.slaughter.building.entity.drawing.MyDrawingChangePdfElement;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
public class DrawingPDFUtils {
/**
* @desc: PDF文档添加水印和设置密码
* @param: [fileData, response, watermark, password]
* @return:
*/
public static void addWatermarkPwd(byte[] fileData, HttpServletResponse response, String watermark, String password) throws Exception {
// 待加水印的文件
PdfReader reader = new PdfReader(fileData);
Field f = PdfReader.class.getDeclaredField("ownerPasswordUsed");
f.setAccessible(true);
f.set(reader, Boolean.TRUE);
PdfStamper stamper = new PdfStamper(reader, response.getOutputStream());
//加密码
if(StringUtils.isNotBlank(password)){
stamper.setEncryption(password.getBytes(), password.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
}
//加水印
if(StringUtils.isNotBlank(watermark)){
// 设置字体
BaseFont baseFont = BaseFont.createFont("/fonts/msyh.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 设置透明度
PdfGState gs = new PdfGState();
// pdf页数
int pageCount = reader.getNumberOfPages() + 1;
PdfContentByte content;
float pageWidth = 0;
float pageHeight = 0;
//字体大小
float fontSize = 90;
// 循环对每页插入水印
for (int i = 1; i < pageCount; i++) {
pageWidth = reader.getPageSize(i).getWidth();
pageHeight = reader.getPageSize(i).getHeight();
// 水印的起始
content = stamper.getOverContent(i);
gs.setFillOpacity(0.5f);
content.setGState(gs);
// 开始
content.beginText