Java在?PDF?中添加數字簽名、水印與權限控制的詳細過程
一、為什么需要數字簽名、水印和權限控制?
在日常的合同管理、發(fā)票開具、文件審批等場景中,PDF 文件已經成為企業(yè)傳遞和保存資料的標準格式。但如果缺乏有效的保護機制,PDF 內容容易被篡改、復制或非法傳播,可能會帶來法律與安全風險。
通過在 PDF 中添加數字簽名、水印以及權限控制,不僅可以防止文檔被擅自修改或打印,還能提升文檔的法律效力與專業(yè)性,幫助企業(yè)實現數字化管理的安全閉環(huán)。
二、添加數字簽名:為 PDF 文件嵌入帶圖像的身份認證簽章
在合同簽署、報表確認等場景中,數字簽名是一種常用且可信的認證方式。與傳統(tǒng)的蓋章或手寫簽名不同,數字簽名依賴于加密證書,可以驗證文檔是否被篡改,并具備法律效力。借助 Spire.PDF for Java,我們可以創(chuàng)建既包含圖章圖像,又具備身份認證能力的可視化數字簽名。
(1)簽名文件準備
- 需要一份擴展名為 .pfx 的數字證書文件(可向 CA 機構申請,也可自行生成測試證書)。
- 準備一張簽名圖(如公司章或手寫簽名),建議使用透明背景的 PNG 。
(2)核心步驟概覽
- 讀取目標 PDF 文件。
- 載入 .pfx 證書,創(chuàng)建 PdfSignature 對象。
- 設定簽名在頁面上的位置與尺寸。
- 填寫簽名人信息并插入簽名圖片。
- (可選)設置禁止修改等權限。
- 保存為新 PDF 文件。
(3)完整代碼示例(可直接復制到 IDEA 編輯和使用)
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.security.*;
import java.awt.*;
import java.awt.geom.*;
public class AddVisibleSignature {
public static void main(String[] args) {
// 創(chuàng)建 PDF 文檔對象
PdfDocument doc = new PdfDocument();
// 載入要簽名的 PDF 文件
doc.loadFromFile("/示例PDF.pdf");
// 加載證書(包含私鑰)
PdfCertificate cert = new PdfCertificate(
"/gary.pfx",
"e-iceblue");
// 創(chuàng)建簽名對象,并指定位置和大小
PdfSignature signature = new PdfSignature(
doc, doc.getPages().get(0), cert, "我的簽名");
Rectangle2D rect = new Rectangle2D.Float();
rect.setFrame(
new Point2D.Float(
(float) doc.getPages().get(0).getActualSize().getWidth() - 320,
(float) doc.getPages().get(0).getActualSize().getHeight() - 140),
new Dimension(270, 100));
signature.setBounds(rect);
// 設置簽章顯示模式:圖像 + 簽章詳情
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
// 填寫簽章信息(會顯示在頁面上)
signature.setNameLabel("簽名:");
signature.setName("我");
signature.setContactInfoLabel("聯系方式:");
signature.setContactInfo("02881705109");
signature.setDateLabel("日期:");
signature.setDate(new java.util.Date());
signature.setLocationInfoLabel("地址:");
signature.setLocationInfo("成都");
signature.setReasonLabel("原因:");
signature.setReason("文件簽署確認");
signature.setDistinguishedNameLabel("DN:");
signature.setDistinguishedName(
signature.getCertificate().get_IssuerName().getName());
// 設置簽名圖像(如公司印章或簽字)
signature.setSignImageSource(
PdfImage.fromFile("/簽名.png"));
// 設置簽名文字字體
signature.setSignDetailsFont(
new PdfFont(PdfFontFamily.Helvetica, 10f, PdfFontStyle.Regular));
// 設置文檔權限:禁止修改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true); // 標記為已簽名
// 保存為新文件
doc.saveToFile("/電子簽名.pdf");
doc.close();
}
}(4)效果預覽:

(Java 在 PDF 中添加電子簽名)
注意事項:
- .pfx 證書需提前準備,可由 CA 機構頒發(fā),也可自行生成測試用證書。
- 簽名圖片支持 PNG、JPG 等常見格式。
- 簽名位置坐標以 PDF 頁面左下角為原點,注意單位是磅(point)。
三、添加文本水?。簽?PDF 文檔標注身份標識
在企業(yè)內部資料、報表、審閱稿等文檔中,添加水印是一種常見做法,既可防止文件被誤用,又能在視覺上標明文檔用途(如“僅供內部使用”、“樣稿”、“機密”等)。相較于手工添加圖層,使用程序批量插入文字水印更高效、統(tǒng)一。
借助 Spire.PDF for Java,我們可以在所有頁面中居中插入帶旋轉角度和透明度的文本水印,字體、顏色、位置均可自定義。
(1)操作步驟概覽
- 讀取目標 PDF 文件;
- 創(chuàng)建字體對象并計算水印偏移;
- 遍歷每一頁,設置透明度、旋轉角度和繪圖位置;
- 繪制文本水?。?/li>
- 保存為新 PDF 文件。
(2)完整代碼示例(可直接復制到 IDEA 使用)
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import java.awt.*;
public class insertSingleTextWaterMark {
public static void main(String[] args) {
// 創(chuàng)建一個 PdfDocument 實例
PdfDocument pdf = new PdfDocument();
// 加載 PDF 文檔
pdf.loadFromFile("/示例PDF.pdf");
// 遍歷每一頁以便插入水印
String text = "示例文檔";
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("FangSong", Font.BOLD, 50));
float set1 = (float) (font.measureString(text).getWidth() * Math.sqrt(2)/4);
float set2 = (float) (font.measureString(text).getHeight() * Math.sqrt(2)/4);
for (int i = 0; i < pdf.getPages().getCount(); i++){
// 獲取頁面
PdfPageBase page = pdf.getPages().get(i);
// 設置水印的透明度
page.getCanvas().setTransparency(0.8f);
// 設置坐標的平移量
page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth()/2 - set1 - set2, page.getCanvas().getSize().getHeight()/2 + set1 - set2);
// 設置旋轉角度
page.getCanvas().rotateTransform(-45);
// 在頁面上繪制水印文本
page.getCanvas().drawString(text, font, PdfBrushes.getDarkGray(), 0, 0);
}
// 保存文檔
pdf.saveToFile("/添加文本水印1.pdf");
}
}(3)效果預覽:

(Java 在 PDF 中添加文本水?。?/p>
溫馨提示:如果只是處理簡單任務或者測試 Spire.PDF,你可以嘗試 Spire.PDF for Java 的免費版。它生成的文件沒有水印,對于處理輕量化文件或項目很合適。
四、設置權限:限制 PDF 文件的打印與修改
在信息敏感或需要控制分發(fā)范圍的場景中,僅添加簽名和水印往往還不夠。為了進一步保護 PDF 文件內容,我們可以通過加密和設置權限,限制用戶的打印、復制、編輯等操作。
Spire.PDF for Java 支持為 PDF 添加密碼,并靈活設定各類操作權限,保障文檔在分發(fā)過程中的安全性與合規(guī)性。
(1)操作步驟概覽
- 讀取原始 PDF 文件;
- 設置打開密碼和權限密碼(可選是否設定打開密碼);
- 指定允許的操作類型(如僅允許打印);
- 選擇加密強度;
- 保存加密后的 PDF 文件。
(2)完整代碼示例(可直接復制到 IDEA 使用)
import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfEncryptionKeySize;
import com.spire.pdf.security.PdfPermissionsFlags;
import java.util.EnumSet;
public class ChangeSecurityPermissions {
public static void main(String[] args) {
// 創(chuàng)建 PDF 文檔對象
PdfDocument doc = new PdfDocument();
// 載入原始 PDF 文件
doc.loadFromFile("/示例文檔.pdf");
// 設置打開密碼(留空表示無需打開密碼)
String openPsd = "";
// 設置權限密碼(修改權限需輸入該密碼)
String permissionPsd = "PDF密碼";
// 設置允許的操作權限(這里只允許打印和高質量打?。?
EnumSet permissionsFlags = EnumSet.of(
PdfPermissionsFlags.Print,
PdfPermissionsFlags.Full_Quality_Print);
// 加密文檔,設定密碼、權限和加密方式(128 位加密)
doc.getSecurity().encrypt(
openPsd, permissionPsd, permissionsFlags, PdfEncryptionKeySize.Key_128_Bit);
// 保存加密后的 PDF 文件
doc.saveToFile("/添加安全權限.pdf");
}
}(3)效果預覽:

(Java 在 PDF 中添加權限限制)
五、總結與擴展:構建更安全、專業(yè)的 PDF 工作流
通過前文的操作,我們已經掌握了在 Java 中使用 Spire.PDF 添加數字簽名、水印和權限控制的完整流程。這三項功能常用于企業(yè)日常的電子合同、內部報表、政策文檔等關鍵文件處理場景,幫助實現:
- 簽名認證:保證文檔來源可信、內容未被篡改;
- 視覺提示:通過水印強化保密意識,防止誤用或泄漏;
- 操作權限管理:限制打印、復制或編輯,防止內容被隨意篡改或外泄。
如果你在使用 Spire.PDF for Java 的過程中遇到問題,或有定制化的開發(fā)需求,歡迎留言交流。
到此這篇關于Java在 PDF 中添加數字簽名、水印與權限控制的文章就介紹到這了,更多相關java pdf數字簽名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring cloud alibaba之Gateway網關功能特征詳解
spring cloud gateway是spring cloud推出的第二代網關,是由WebFlux+Netty+Reactor實現的響應式的API網關,它不能在傳統(tǒng)的servlet容器中工作,也不能構建成war包,接下來通過本文給大家分享Spring cloud alibaba--Gateway網關,需要的朋友可以參考下2021-08-08
SpringBoot使用Nacos動態(tài)配置數據源的方法
這篇文章主要介紹了SpringBoot使用Nacos動態(tài)配置數據源的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Java實現一鍵獲取Mysql所有表字段設計和建表語句的工具類
這篇文章主要為大家詳細介紹了如何利用Java編寫一個工具類,可以實現一鍵獲取Mysql所有表字段設計和建表語句,感興趣的小伙伴可以了解一下2023-05-05
解決SpringBoot使用@Value獲取不到y(tǒng)aml中配置值的問題
在最近的開發(fā)中遇到一個問題,使用@Value獲取yml文件中配置的屬性時始終獲取不到值,所以本文給大家詳細介紹了SpringBoot使用@Value獲取不到y(tǒng)aml中值的問題分析及解決方法,需要的朋友可以參考下2024-01-01

