Java在?PDF?中添加數(shù)字簽名、水印與權(quán)限控制的詳細(xì)過程
一、為什么需要數(shù)字簽名、水印和權(quán)限控制?
在日常的合同管理、發(fā)票開具、文件審批等場景中,PDF 文件已經(jīng)成為企業(yè)傳遞和保存資料的標(biāo)準(zhǔn)格式。但如果缺乏有效的保護(hù)機(jī)制,PDF 內(nèi)容容易被篡改、復(fù)制或非法傳播,可能會帶來法律與安全風(fēng)險。
通過在 PDF 中添加數(shù)字簽名、水印以及權(quán)限控制,不僅可以防止文檔被擅自修改或打印,還能提升文檔的法律效力與專業(yè)性,幫助企業(yè)實現(xiàn)數(shù)字化管理的安全閉環(huán)。
二、添加數(shù)字簽名:為 PDF 文件嵌入帶圖像的身份認(rèn)證簽章
在合同簽署、報表確認(rèn)等場景中,數(shù)字簽名是一種常用且可信的認(rèn)證方式。與傳統(tǒng)的蓋章或手寫簽名不同,數(shù)字簽名依賴于加密證書,可以驗證文檔是否被篡改,并具備法律效力。借助 Spire.PDF for Java,我們可以創(chuàng)建既包含圖章圖像,又具備身份認(rèn)證能力的可視化數(shù)字簽名。
(1)簽名文件準(zhǔn)備
- 需要一份擴(kuò)展名為 .pfx 的數(shù)字證書文件(可向 CA 機(jī)構(gòu)申請,也可自行生成測試證書)。
- 準(zhǔn)備一張簽名圖(如公司章或手寫簽名),建議使用透明背景的 PNG 。
(2)核心步驟概覽
- 讀取目標(biāo) PDF 文件。
- 載入 .pfx 證書,創(chuàng)建 PdfSignature 對象。
- 設(shè)定簽名在頁面上的位置與尺寸。
- 填寫簽名人信息并插入簽名圖片。
- (可選)設(shè)置禁止修改等權(quán)限。
- 保存為新 PDF 文件。
(3)完整代碼示例(可直接復(fù)制到 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);
// 設(shè)置簽章顯示模式:圖像 + 簽章詳情
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
// 填寫簽章信息(會顯示在頁面上)
signature.setNameLabel("簽名:");
signature.setName("我");
signature.setContactInfoLabel("聯(lián)系方式:");
signature.setContactInfo("02881705109");
signature.setDateLabel("日期:");
signature.setDate(new java.util.Date());
signature.setLocationInfoLabel("地址:");
signature.setLocationInfo("成都");
signature.setReasonLabel("原因:");
signature.setReason("文件簽署確認(rèn)");
signature.setDistinguishedNameLabel("DN:");
signature.setDistinguishedName(
signature.getCertificate().get_IssuerName().getName());
// 設(shè)置簽名圖像(如公司印章或簽字)
signature.setSignImageSource(
PdfImage.fromFile("/簽名.png"));
// 設(shè)置簽名文字字體
signature.setSignDetailsFont(
new PdfFont(PdfFontFamily.Helvetica, 10f, PdfFontStyle.Regular));
// 設(shè)置文檔權(quán)限:禁止修改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true); // 標(biāo)記為已簽名
// 保存為新文件
doc.saveToFile("/電子簽名.pdf");
doc.close();
}
}(4)效果預(yù)覽:

(Java 在 PDF 中添加電子簽名)
注意事項:
- .pfx 證書需提前準(zhǔn)備,可由 CA 機(jī)構(gòu)頒發(fā),也可自行生成測試用證書。
- 簽名圖片支持 PNG、JPG 等常見格式。
- 簽名位置坐標(biāo)以 PDF 頁面左下角為原點,注意單位是磅(point)。
三、添加文本水?。簽?PDF 文檔標(biāo)注身份標(biāo)識
在企業(yè)內(nèi)部資料、報表、審閱稿等文檔中,添加水印是一種常見做法,既可防止文件被誤用,又能在視覺上標(biāo)明文檔用途(如“僅供內(nèi)部使用”、“樣稿”、“機(jī)密”等)。相較于手工添加圖層,使用程序批量插入文字水印更高效、統(tǒng)一。
借助 Spire.PDF for Java,我們可以在所有頁面中居中插入帶旋轉(zhuǎn)角度和透明度的文本水印,字體、顏色、位置均可自定義。
(1)操作步驟概覽
- 讀取目標(biāo) PDF 文件;
- 創(chuàng)建字體對象并計算水印偏移;
- 遍歷每一頁,設(shè)置透明度、旋轉(zhuǎn)角度和繪圖位置;
- 繪制文本水?。?/li>
- 保存為新 PDF 文件。
(2)完整代碼示例(可直接復(fù)制到 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);
// 設(shè)置水印的透明度
page.getCanvas().setTransparency(0.8f);
// 設(shè)置坐標(biāo)的平移量
page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth()/2 - set1 - set2, page.getCanvas().getSize().getHeight()/2 + set1 - set2);
// 設(shè)置旋轉(zhuǎn)角度
page.getCanvas().rotateTransform(-45);
// 在頁面上繪制水印文本
page.getCanvas().drawString(text, font, PdfBrushes.getDarkGray(), 0, 0);
}
// 保存文檔
pdf.saveToFile("/添加文本水印1.pdf");
}
}(3)效果預(yù)覽:

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

(Java 在 PDF 中添加權(quán)限限制)
五、總結(jié)與擴(kuò)展:構(gòu)建更安全、專業(yè)的 PDF 工作流
通過前文的操作,我們已經(jīng)掌握了在 Java 中使用 Spire.PDF 添加數(shù)字簽名、水印和權(quán)限控制的完整流程。這三項功能常用于企業(yè)日常的電子合同、內(nèi)部報表、政策文檔等關(guān)鍵文件處理場景,幫助實現(xiàn):
- 簽名認(rèn)證:保證文檔來源可信、內(nèi)容未被篡改;
- 視覺提示:通過水印強(qiáng)化保密意識,防止誤用或泄漏;
- 操作權(quán)限管理:限制打印、復(fù)制或編輯,防止內(nèi)容被隨意篡改或外泄。
如果你在使用 Spire.PDF for Java 的過程中遇到問題,或有定制化的開發(fā)需求,歡迎留言交流。
到此這篇關(guān)于Java在 PDF 中添加數(shù)字簽名、水印與權(quán)限控制的文章就介紹到這了,更多相關(guān)java pdf數(shù)字簽名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot啟動后直接關(guān)閉了的問題解決
本文主要介紹了spring boot啟動后直接關(guān)閉了的問題解決,SpringBoot項目啟動后自動關(guān)閉的原因是未引入web依賴,導(dǎo)致以普通Java項目運行,下面就來介紹一下解決方法,感興趣的可以了解一下2025-02-02
mybatis使用foreach標(biāo)簽進(jìn)行嵌套插入
數(shù)據(jù)庫插入操作常見于多層架構(gòu)設(shè)計中,本文提供了一個具體的實現(xiàn)方案,涉及三層實體類結(jié)構(gòu),第一層實體類負(fù)責(zé)基本數(shù)據(jù)結(jié)構(gòu)的定義,第二層和第三層實體類則提供更詳細(xì)的業(yè)務(wù)邏輯處理,同時,文章還介紹了相應(yīng)的mapper接口和配置文件設(shè)置2024-09-09
Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記
這篇文章主要介紹了Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記,SSH是指Struts和Spring以及Hibernate的框架搭配,需要的朋友可以參考下2015-12-12
Java實現(xiàn)優(yōu)雅停止線程的有效方法詳解
這篇文章主要為大家詳細(xì)如何安全有效停止 Java 線程的,確保多線程應(yīng)用程序平穩(wěn)運行并實現(xiàn)最佳資源管理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)
下面小編就為大家?guī)硪黄贘ava class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
java中 IO 常用IO操作類繼承結(jié)構(gòu)分析
本篇文章小編為大家介紹,java中 IO 常用IO操作類繼承結(jié)構(gòu)分析。需要的朋友參考下2013-04-04
詳解Java中NullPointerException異常的原因詳解以及解決方法
這篇文章主要介紹了詳解Java中NullPointerException異常的原因詳解以及解決方法。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
深入理解Java中的HashMap的實現(xiàn)機(jī)制
這篇文章主要介紹了深入理解Java中的HashMap的實現(xiàn)機(jī)制,同時也有助于理解Java中對于哈希函數(shù)的相關(guān)處理方式,需要的朋友可以參考下2015-07-07

