Java利用Spire.PDF for Java實現(xiàn)在PDF中添加或刪除數(shù)字簽名
在數(shù)字化辦公日益普及的今天,PDF文檔的安全性與真實性變得尤為重要。數(shù)字簽名作為一種電子加密技術(shù),能夠有效驗證文檔的來源、確保內(nèi)容完整性,并提供不可抵賴的法律效力。本文將深入探討如何在Java環(huán)境中,利用強大的Spire.PDF for Java庫,對PDF文檔進行數(shù)字簽名的添加與刪除操作。
1. Spire.PDF for Java 庫介紹與安裝
Spire.PDF for Java是一款功能豐富的PDF處理庫,它允許開發(fā)者在Java應(yīng)用程序中輕松創(chuàng)建、讀寫、編輯和轉(zhuǎn)換PDF文檔。其突出優(yōu)勢在于對PDF標準的高度兼容性、強大的渲染能力以及對復(fù)雜PDF特性(如數(shù)字簽名、表單、圖層等)的良好支持。對于數(shù)字簽名操作,Spire.PDF for Java提供了直觀易用的API,極大地簡化了開發(fā)流程。
Maven 依賴配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.10.3</version>
</dependency>
</dependencies>
2. Java 在 PDF 中添加數(shù)字簽名
添加數(shù)字簽名通常涉及加載PDF、加載數(shù)字證書、設(shè)置簽名外觀和信息,最后保存文檔。
步驟詳解:
- 加載PDF文檔: 使用
PdfDocument類加載目標PDF文件。 - 加載數(shù)字證書: 數(shù)字證書通常以PKS12(.pfx或.p12)格式存儲,包含私鑰和公鑰。使用
PdfCertificate類加載證書文件及密碼。 - 創(chuàng)建簽名對象: 實例化
PdfSignature對象,指定PDF文檔、簽名頁、證書和簽名名稱。 - 設(shè)置簽名區(qū)域: 定義簽名在頁面上的位置和大小,通過
setBounds方法設(shè)置。 - 配置簽名外觀: Spire.PDF支持多種簽名外觀模式,例如只顯示圖像、只顯示簽名詳情、同時顯示圖像和詳情等??梢酝ㄟ^
setGraphicMode方法進行設(shè)置。 - 設(shè)置簽名信息: 包括簽名者姓名、聯(lián)系信息、簽名地點、簽名原因等。
- 保存PDF: 將帶有數(shù)字簽名的PDF文檔保存到新文件或覆蓋原文件。
Java 代碼示例:
import com.spire.pdf.graphics.*;
import com.spire.pdf.security.GraphicMode;
import com.spire.pdf.security.PdfCertificate;
import com.spire.pdf.security.PdfCertificationFlags;
import com.spire.pdf.security.PdfSignature;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
public class AddDigitalSignature {
public static void main(String[] args) {
//加載PDF文檔
PdfDocument doc = new PdfDocument();
doc.loadFromFile("C:\Users\Administrator\Desktop\sample.pdf");
//加載pfx證書
PdfCertificate cert = new PdfCertificate("C:\Users\Administrator\Desktop\gary.pfx", "e-iceblue");
//添加數(shù)字簽名,設(shè)置其位置和大小
PdfSignature signature = new PdfSignature(doc, doc.getPages().get(0), cert, "MySignature");
Rectangle2D rect = new Rectangle2D.Float();
rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 340, (float) doc.getPages().get(0).getActualSize().getHeight() - 150), new Dimension(270, 100));
signature.setBounds(rect);
//設(shè)置簽名為圖片加文本模式
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
//設(shè)置簽名的內(nèi)容
signature.setNameLabel("簽字者:");
signature.setName("Gary");
signature.setContactInfoLabel("聯(lián)系電話:");
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("C:\Users\Administrator\Desktop\logo-2.png"));
//設(shè)置簽名的字體
signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("宋體", Font.PLAIN, 12)));
//設(shè)置文檔權(quán)限為禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);
//保存文檔
doc.saveToFile("output/AddSignature.pdf");
doc.close();
}
}
上述代碼將會在PDF文檔的第一頁的指定區(qū)域添加一個包含證書信息、簽名者姓名、聯(lián)系方式、地點和原因的數(shù)字簽名。
3. Java 在 PDF 中刪除數(shù)字簽名
刪除數(shù)字簽名相對簡單,主要步驟是識別并移除簽名域。
步驟詳解:
- 加載PDF文檔: 加載包含數(shù)字簽名的PDF文件。
- 獲取表單字段: PDF中的數(shù)字簽名通常被視為一種特殊的表單字段。通過doc.getForm().getFields()獲取所有表單字段。
- 遍歷并識別簽名域: 遍歷字段列表,判斷字段類型是否為PdfSignatureField。
- 移除簽名域: 從表單字段列表中移除找到的簽名域。
- 保存PDF: 保存修改后的PDF文檔。
Java 代碼示例:
import com.spire.pdf.PdfDocument;
import com.spire.pdf.widget.PdfFieldWidget;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
public class RemoveSignature {
public static void main(String[] args) {
//創(chuàng)建PdfDocument對象
PdfDocument pdf = new PdfDocument();
//加載PDF文檔
pdf.loadFromFile("C:\Users\Administrator\Desktop\Signature.pdf");
//從文檔獲取form widget集合
PdfFormWidget widgets = (PdfFormWidget) pdf.getForm();
//遍歷集合中的每一個元素
for (int i = 0; i < widgets.getFieldsWidget().getList().size(); i++)
{
//獲取指定widget
PdfFieldWidget widget = (PdfFieldWidget)widgets.getFieldsWidget().getList().get(i);
//判斷widget是否為PdfSignatureFieldWidget
if (widget instanceof PdfSignatureFieldWidget)
{
//刪除數(shù)字簽名widget
widgets.getFieldsWidget().remove(widget);
}
}
//保存文檔
pdf.saveToFile("RemoveSignature.pdf");
}
}
注意事項:
刪除數(shù)字簽名會破壞原始文檔的完整性,通常用于測試或特殊場景。
如果文檔被多個數(shù)字簽名保護,上述代碼會移除所有簽名。若需選擇性刪除,則需要根據(jù)簽名名稱或其他屬性進行判斷。
總結(jié)
本文詳細介紹了如何使用Spire.PDF for Java庫在PDF文檔中添加和刪除數(shù)字簽名。通過直觀的API和清晰的代碼示例,開發(fā)者可以輕松地實現(xiàn)PDF文檔的數(shù)字簽名操作,從而增強文檔的安全性、真實性和法律效力。數(shù)字簽名在合同簽署、電子票據(jù)、證書管理等領(lǐng)域發(fā)揮著不可替代的作用,掌握這一技術(shù)對于構(gòu)建安全的數(shù)字化應(yīng)用至關(guān)重要。
到此這篇關(guān)于Java利用Spire.PDF for Java實現(xiàn)在PDF中添加或刪除數(shù)字簽名的文章就介紹到這了,更多相關(guān)Java PDF添加或刪除數(shù)字簽名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)基于URL和IP的訪問頻率限制
在現(xiàn)代?Web?應(yīng)用中,接口被惡意刷新或暴力請求是一種常見的攻擊手段,為了保護系統(tǒng)資源,需要對接口的訪問頻率進行限制,下面我們就來看看如何使用?Spring?Boot?實現(xiàn)基于?URL?和?IP?的訪問頻率限制吧2025-01-01
jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面
這篇文章主要介紹了jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問題
這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Linux下用java -jar運行可執(zhí)行jar包的方法教程
這篇文章主要給大家介紹了在Linux下用java -jar運行可執(zhí)行jar包的方法教程,文中介紹的非常詳細,相信對大家的工作或者學(xué)習(xí)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05

