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)險(xiǎn)。
通過在 PDF 中添加數(shù)字簽名、水印以及權(quán)限控制,不僅可以防止文檔被擅自修改或打印,還能提升文檔的法律效力與專業(yè)性,幫助企業(yè)實(shí)現(xiàn)數(shù)字化管理的安全閉環(huán)。
二、添加數(shù)字簽名:為 PDF 文件嵌入帶圖像的身份認(rèn)證簽章
在合同簽署、報(bào)表確認(rèn)等場景中,數(shù)字簽名是一種常用且可信的認(rèn)證方式。與傳統(tǒng)的蓋章或手寫簽名不同,數(shù)字簽名依賴于加密證書,可以驗(yàn)證文檔是否被篡改,并具備法律效力。借助 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 中添加電子簽名)
注意事項(xiàng):
- .pfx 證書需提前準(zhǔn)備,可由 CA 機(jī)構(gòu)頒發(fā),也可自行生成測試用證書。
- 簽名圖片支持 PNG、JPG 等常見格式。
- 簽名位置坐標(biāo)以 PDF 頁面左下角為原點(diǎn),注意單位是磅(point)。
三、添加文本水?。簽?PDF 文檔標(biāo)注身份標(biāo)識
在企業(yè)內(nèi)部資料、報(bào)表、審閱稿等文檔中,添加水印是一種常見做法,既可防止文件被誤用,又能在視覺上標(biāo)明文檔用途(如“僅供內(nèi)部使用”、“樣稿”、“機(jī)密”等)。相較于手工添加圖層,使用程序批量插入文字水印更高效、統(tǒng)一。
借助 Spire.PDF for Java,我們可以在所有頁面中居中插入帶旋轉(zhuǎn)角度和透明度的文本水印,字體、顏色、位置均可自定義。
(1)操作步驟概覽
- 讀取目標(biāo) PDF 文件;
- 創(chuàng)建字體對象并計(jì)算水印偏移;
- 遍歷每一頁,設(shè)置透明度、旋轉(zhuǎn)角度和繪圖位置;
- 繪制文本水??;
- 保存為新 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 實(shí)例
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 的免費(fèi)版。它生成的文件沒有水印,對于處理輕量化文件或項(xiàng)目很合適。
四、設(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)限控制的完整流程。這三項(xiàng)功能常用于企業(yè)日常的電子合同、內(nèi)部報(bào)表、政策文檔等關(guān)鍵文件處理場景,幫助實(shí)現(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)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例
- Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法
- Java使用itextpdf實(shí)現(xiàn)生成PDF并添加圖片,水印和文字
- Java批量向PDF文件中添加圖像水印實(shí)現(xiàn)細(xì)節(jié)
- Java實(shí)現(xiàn)Excel文件轉(zhuǎn)PDF(無水印無限制)
- Java實(shí)現(xiàn)PDF轉(zhuǎn)Word的示例代碼(無水印無頁數(shù)限制)
- java實(shí)現(xiàn)word文檔轉(zhuǎn)pdf并添加水印的方法詳解
相關(guān)文章
Spring cloud alibaba之Gateway網(wǎng)關(guān)功能特征詳解
spring cloud gateway是spring cloud推出的第二代網(wǎng)關(guān),是由WebFlux+Netty+Reactor實(shí)現(xiàn)的響應(yīng)式的API網(wǎng)關(guān),它不能在傳統(tǒng)的servlet容器中工作,也不能構(gòu)建成war包,接下來通過本文給大家分享Spring cloud alibaba--Gateway網(wǎng)關(guān),需要的朋友可以參考下2021-08-08
SpringBoot使用Nacos動態(tài)配置數(shù)據(jù)源的方法
這篇文章主要介紹了SpringBoot使用Nacos動態(tài)配置數(shù)據(jù)源的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Java實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語句的工具類
這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個工具類,可以實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語句,感興趣的小伙伴可以了解一下2023-05-05
解決SpringBoot使用@Value獲取不到y(tǒng)aml中配置值的問題
在最近的開發(fā)中遇到一個問題,使用@Value獲取yml文件中配置的屬性時始終獲取不到值,所以本文給大家詳細(xì)介紹了SpringBoot使用@Value獲取不到y(tǒng)aml中值的問題分析及解決方法,需要的朋友可以參考下2024-01-01
SpringBoot yml配置敏感信息加密的實(shí)現(xiàn)
本文主要介紹了SpringBoot yml配置敏感信息加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Mybatis操作Clickhouse數(shù)組的最佳實(shí)踐分享
ClickHouse 的 Array(T) 數(shù)據(jù)類型支持任意有效數(shù)據(jù)類型作為元素,包括基本類型、嵌套數(shù)組和可空類型,本文給大家分享了Mybatis操作Clickhouse數(shù)組的最佳實(shí)踐,需要的朋友可以參考下2025-09-09

