前言
繼上次研究java實作pdf的分割 和pdf合并功能后,這次給大家貢獻java實作pdf添加水印和去除水印的代碼,
教程
引入第三方jar依賴
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.0-RC1</version>
</dependency>
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-jpeg2000</artifactId>
<version>1.3.0</version>
</dependency>
核心代碼實作
該代碼實作將pdf添加自定義文字水印,pdf水印去除的功能,
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;
import java.awt.*;
import java.io.*;
import java.util.Iterator;
public class PDFHelper {
public static void main(String[] args) throws Exception {
addWatermark(new File("C:\\Users\\liuya\\Desktop\\pdf\\test.pdf"), "tarzan");
removeWatermark(new File("C:\\Users\\liuya\\Desktop\\pdf\\test_waterMark.pdf"));
}
/**
* pdf添加文字水印
*/
private static void addWatermark(File file, String text) {
try {
PDDocument document = Loader.loadPDF(file);
document.setAllSecurityToBeRemoved(true);
for (PDPage page : document.getPages()) {
PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
//pdf擴展圖形物件
PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
// 透明度
graphicsState.setNonStrokingAlphaConstant(0.2f);
graphicsState.setAlphaSourceFlag(true);
cs.setGraphicsStateParameters(graphicsState);
cs.setNonStrokingColor(Color.red);//Red
cs.beginText();
cs.setFont(PDType1Font.HELVETICA_OBLIQUE, 50.0f);
// 獲取旋轉實體
cs.setTextMatrix(Matrix.getRotateInstance(20, 350f, 490f));
cs.showText(text);
cs.endText();
cs.close();
}
String folderPath= file.getParent();
String fileName=file.getName().substring(0,file.getName().lastIndexOf("."));
document.save(folderPath+File.separator+fileName+"_waterMark"+".pdf");
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* pdf去除水印
*/
public static boolean removeWatermark(File file) {
try{
//通過檔案名加載檔案
PDDocument document = Loader.loadPDF(file);
PDPageTree pages = document.getPages();
Iterator<PDPage> iter = pages.iterator();
while(iter.hasNext()){
PDPage page = iter.next();
PDResources resources =page.getResources();
resources.getExtGStateNames().forEach(ext->{
PDExtendedGraphicsState gState=resources.getExtGState(ext);
gState.setNonStrokingAlphaConstant(0.0f);
});
}
String folderPath= file.getParent();
String fileName=file.getName().substring(0,file.getName().lastIndexOf("."));
document.save(folderPath+File.separator+fileName+"_noMark"+".pdf");
document.close();
return true;
} catch(IOException ex){
ex.printStackTrace();
return false;
}
}
}
添加水印效果圖

去除水印對比圖
相關文章推薦
《JAVA實作PDF合并、拆分代碼工具類》
溫馨提示,如有技術問題,請在評論區留言,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/298937.html
標籤:java
上一篇:【演算法學習】1920. 基于排列構建陣列(java / c / c++ / python / go / rust)

