之前通过itext7 对PDF做了文字的纯色遮挡,后来发下虽然遮挡了,但是还是可以复制遮挡下的文字.所以加上文档加密做到禁止复制打印等功能.
pom.xml
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.1.11</version>
</dependency>
/**
* 给PDF指定页位置纯色遮挡
*
* @param source 输入流
* @param target 输出流
* @param x 图片要打码区域左上角的横坐标
* @param y 图片要打码区域左上角的纵坐标
* @param pageNum 需要修改的页数
* @param width 图片要打码区域的宽度
* @param height 图片要打码区域的高度
* @param color 遮挡颜色
*/
public static void occlusion(InputStream source, OutputStream target, int pageNum,
int x, int y, int width, int height, Color color) throws IOException {
PdfDocument pdfDoc = null;
try {
WriterProperties wp = new WriterProperties();
//禁止打印 复制 等操作
wp.setStandardEncryption(null, null, 0, EncryptionConstants.DO_NOT_ENCRYPT_METADATA);
pdfDoc = new PdfDocument(new PdfReader(source), new PdfWriter(target, wp));
int numberOfPages = pdfDoc.getNumberOfPages();
if (numberOfPages < pageNum || pageNum < 1) {
log.error("指定修改页数{}大于PDF总页数{}", pageNum, numberOfPages);
pdfDoc.close();
return;
}
PdfCanvas canvas = new PdfCanvas(pdfDoc.getPage(pageNum));
//初始阶段完成 开始替换
canvas.saveState();
//黑色背景覆盖
canvas.setFillColor(color);
//定位
canvas.rectangle(x, y, width, height);
//填充
canvas.fill();
//还原状态
canvas.restoreState();
pdfDoc.close();
} finally {
if (null != pdfDoc) {
pdfDoc.close();
pdfDoc = null;
}
}
}
测试代码:
String src = "需要遮挡的PDF路径";
String distPath = "输出PDF路径";
FileInputStream fileInputStream = new FileInputStream(src);
FileOutputStream fileOutputStream = new FileOutputStream(distPath);
occlusion(fileInputStream, fileOutputStream, 1, 65, 660, 320, 80, ColorConstants.LIGHT_GRAY);