如何在Java中數位簽署PDF
在Java中使用IronPDF對PDF進行數位簽署,讓您可以應用加密簽章來驗證文件的真實性並檢測未經授權的更改。 IronPDF支持PdfCertificationLevel控制PDF的認證級別,並連接到時間戳機構伺服器以確保長期簽名有效性。
快速入門:在Java中數位簽署PDF
- 透過Maven或Gradle安裝 IronPDF for Java
- 使用
License.setLicenseKey()設置您的授權金鑰 - 使用
PdfDocument.fromFile()載入PDF - 使用您的PFX證書文件和密碼建立
PdfSignature - 使用
signDigitalSignature()套用簽名 - 使用
saveAs()保存已簽署的PDF
:title=Quickstart
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/quickstart.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load an existing PDF document
PdfDocument pdf = PdfDocument.fromFile(Path.of("document.pdf"));
// Create a PdfSignature using a PFX certificate file and its password
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set signature metadata for audit trails
signature.setSigningContact("John Smith");
signature.setSigningLocation("New York");
signature.setSigningReason("Document Approval");
// Apply the digital signature to the PDF
pdf.signDigitalSignature(signature);
// Save the signed PDF to a new file
pdf.saveAs(Path.of("signed.pdf"));
}
}
:title=Quickstart
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/quickstart.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load an existing PDF document
PdfDocument pdf = PdfDocument.fromFile(Path.of("document.pdf"));
// Create a PdfSignature using a PFX certificate file and its password
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set signature metadata for audit trails
signature.setSigningContact("John Smith");
signature.setSigningLocation("New York");
signature.setSigningReason("Document Approval");
// Apply the digital signature to the PDF
pdf.signDigitalSignature(signature);
// Save the signed PDF to a new file
pdf.saveAs(Path.of("signed.pdf"));
}
}
數位簽章為PDF文件提供了一個與私密金鑰和證書相關的加密身份。 當收件人使用Adobe Acrobat或任何相容的檢視器打開已簽署的PDF時,應用程式會驗證證書鏈是否可追溯至受信任的機構,並且文件內容自簽署以來未進行過更改。 這種身份驗證與完整性的結合使數位簽章對於合約、發票、監管申報文件以及任何涉及抵觸證據的文件來說都至關重要。
PDF簽章有兩種型別:批准簽章和作者(認證)簽章。 批准簽章會記錄一個簽署人在某一時刻的批准;多方可以依次新增批准簽章而不會使較早的簽章失效。 認證簽章通過PdfCertificationLevel鎖定文件,並將簽署者標記為文件的作者。 認證簽章必須是文件上的第一個簽章,並管控後續簽署者可以進行的更改(如果有的話)。
IronPDF通過PdfDocument構建的統一API來處理兩種簽章型別。 有關初步設置、依賴項配置及授權金鑰說明,請參閱入門概覽。
如何在Java中數位簽署PDF
- 安裝IronPDF Java程式庫以進行數位簽署
- 使用 PdfDocument 類載入PDF
- 使用PFX證書文件和密碼建立 PdfSignature
- 可選地使用
setSignatureImage設置可見的簽名圖片 - 用
signDigitalSignature套用簽名 - 使用
certify和PdfCertificationLevel認證PDF - 使用
saveAs保存已簽署的PDF
開始之前我需要什麼準備?
在使用IronPDF簽署PDF之前,請確認以下先決條件:
- Java 8 或更高版本:IronPDF需要JDK版本8或更高。
- IronPDF for Java:在您的構建文件中新增此依賴項。在Maven Central找到最新版本。
- 有效的授權金鑰:使用
License.setLicenseKey()在應用程式啟動時設置金鑰。 有關詳細的設置說明,請存取授權金鑰指南。 - PFX或P12證書文件:這是一個受密碼保護的存檔,其中包含您的私鑰和以PKCS#12格式儲存的公共證書。 自簽名證書適用於開發和測試; 對於需要外部接收者信任的生產文件,請使用由受認可的證書機構(CA)如DigiCert、Comodo或GlobalSign頒發的證書。
有關完整的依賴項設置和專案配置,請參閱入門概覽。
我如何在PDF上應用數位簽章?
PdfSignature構造函式需要您的PFX證書的文件路徑及其密碼。 構造完成後,您可以通過三個設置方法附加可選元資料:
setSigningContact(String):簽署人的姓名或電子郵件setSigningLocation(String):簽署人的物理或組織位置setSigningReason(String):文件簽署原因的簡短描述
這些欄位會顯示在PDF檢視器的簽章屬性面板中,為合規性目的建立有用的審核記錄。 在已載入的saveAs()保存結果。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/apply-signature.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF to sign
PdfDocument pdf = PdfDocument.fromFile(Path.of("contract.pdf"));
// Construct the PdfSignature with the certificate path and password
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set metadata that will appear in the signature properties panel
signature.setSigningContact("Jane Doe");
signature.setSigningLocation("Austin, TX");
signature.setSigningReason("Contract Approval");
// Embed the digital signature in the PDF
pdf.signDigitalSignature(signature);
// Save the signed document
pdf.saveAs(Path.of("contract-signed.pdf"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/apply-signature.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF to sign
PdfDocument pdf = PdfDocument.fromFile(Path.of("contract.pdf"));
// Construct the PdfSignature with the certificate path and password
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set metadata that will appear in the signature properties panel
signature.setSigningContact("Jane Doe");
signature.setSigningLocation("Austin, TX");
signature.setSigningReason("Contract Approval");
// Embed the digital signature in the PDF
pdf.signDigitalSignature(signature);
// Save the signed document
pdf.saveAs(Path.of("contract-signed.pdf"));
}
}
在signDigitalSignature()完成之後,PDF包含了用PFX文件中的私鑰簽署的文件內容的加密哈希。此時之後對文件的任何修改都將使簽名失效。
我如何在PDF上新增可見簽名圖片?
可見的簽名圖片將圖像直接放在PDF頁面上的簽名欄位位置。 這通常用於顯示掃描的手寫簽名、公司印章或商標,使文件在列印或查看時顯示為已簽名,而不僅限於PDF閱讀器的簽章面板檢查。
要新增可見圖片,將影像文件開啟為PdfSignature.setSignatureImage(InputStream)。 該圖片會嵌入到頁面的簽名欄位中。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/visible-signature-image.java
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF document to sign
PdfDocument pdf = PdfDocument.fromFile(Path.of("agreement.pdf"));
// Build the PdfSignature from a PFX certificate
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set signing metadata
signature.setSigningContact("Alice Johnson");
signature.setSigningLocation("Chicago, IL");
signature.setSigningReason("Agreement Authorization");
// Open the signature image file and attach it to the signature
FileInputStream imageStream = new FileInputStream("signature.png");
signature.setSignatureImage(imageStream);
// Apply the digital signature with the visible image to the PDF
pdf.signDigitalSignature(signature);
// Save the signed PDF with the visible signature image embedded
pdf.saveAs(Path.of("agreement-signed.pdf"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/visible-signature-image.java
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF document to sign
PdfDocument pdf = PdfDocument.fromFile(Path.of("agreement.pdf"));
// Build the PdfSignature from a PFX certificate
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set signing metadata
signature.setSigningContact("Alice Johnson");
signature.setSigningLocation("Chicago, IL");
signature.setSigningReason("Agreement Authorization");
// Open the signature image file and attach it to the signature
FileInputStream imageStream = new FileInputStream("signature.png");
signature.setSignatureImage(imageStream);
// Apply the digital signature with the visible image to the PDF
pdf.signDigitalSignature(signature);
// Save the signed PDF with the visible signature image embedded
pdf.saveAs(Path.of("agreement-signed.pdf"));
}
}
簽名圖片不會取代加密保護; 圖形戳記和基礎證書都會是簽署後的輸出的一部分。 簽名圖片支持PNG和JPEG格式。
我如何以特定許可等級認證PDF?
認證PDF與新增批准簽章不同。 當您調用pdf.certify(PdfSignature, PdfCertificationLevel)時,您簽署文件為其作者並指定隨後使用者允許的更改型別。 經過認證的PDF在Adobe Acrobat中顯示藍色緞帶或類似的信任指標,表明收件人文件來自經驗證的來源。
IronPDF通過PdfCertificationLevel枚舉提供三種認證級別:
PdfCertificationLevel.NO_CHANGES_ALLOWED:在認證後,文件完全被鎖定; 不允許進一步改動。PdfCertificationLevel.FORM_FILLING:收件人可以填寫表單欄位,但不能新增評論、註釋或其他變更。PdfCertificationLevel.FORM_FILLING_AND_ANNOTATIONS:收件人可以填寫表單欄位並新增註釋,但仍然禁止結構性編輯。
由於認證簽章必須是文件上的第一個簽名,因此在套用來自其他方的任何批准簽章之前,調用certify()。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/certify-pdf.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfCertificationLevel;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF that will be certified
PdfDocument pdf = PdfDocument.fromFile(Path.of("report.pdf"));
// Create the PdfSignature from the author's certificate
PdfSignature signature = new PdfSignature("author-certificate.pfx", "password123");
// Set author metadata for the certification signature
signature.setSigningContact("Legal Department");
signature.setSigningLocation("San Francisco, CA");
signature.setSigningReason("Official Publication");
// Certify the document with NO_CHANGES_ALLOWED to lock it completely
// Use FORM_FILLING to allow form field input after certification
// Use FORM_FILLING_AND_ANNOTATIONS to also permit annotations
pdf.certify(signature, PdfCertificationLevel.NO_CHANGES_ALLOWED);
// Save the certified PDF
pdf.saveAs(Path.of("report-certified.pdf"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/certify-pdf.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfCertificationLevel;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF that will be certified
PdfDocument pdf = PdfDocument.fromFile(Path.of("report.pdf"));
// Create the PdfSignature from the author's certificate
PdfSignature signature = new PdfSignature("author-certificate.pfx", "password123");
// Set author metadata for the certification signature
signature.setSigningContact("Legal Department");
signature.setSigningLocation("San Francisco, CA");
signature.setSigningReason("Official Publication");
// Certify the document with NO_CHANGES_ALLOWED to lock it completely
// Use FORM_FILLING to allow form field input after certification
// Use FORM_FILLING_AND_ANNOTATIONS to also permit annotations
pdf.certify(signature, PdfCertificationLevel.NO_CHANGES_ALLOWED);
// Save the certified PDF
pdf.saveAs(Path.of("report-certified.pdf"));
}
}
一旦用NO_CHANGES_ALLOWED進行認證,任何修改PDF的嘗試都將破壞認證簽章且PDF檢視器會顯示警告。 當認證後的文件需要由下游接收者填寫或註釋而不使作者的認證無效時,選擇FORM_FILLING_AND_ANNOTATIONS。
我如何在數位簽章中新增時間戳?
時間戳機構(TSA)伺服器提供了一個加密簽署的時間令牌,該令牌與PDF簽章一同嵌入。 這個時間戳證明在簽署者本地時鐘之外應用了何時的簽章。 長期有效性依賴於時間戳:即使在簽名證書過期後,可信的時間戳也允許驗證器確認簽名是在證書仍然有效時建立的。
為啟用時間戳功能,在簽章前於PdfSignature物件上設置兩個屬性:
setTimestampHashAlgorithm(PdfHashAlgorithm):指定計算時間戳令牌時使用的雜湊演算法。 標準選擇為PdfHashAlgorithm.SHA256。setTimestampUrl(String):將用於發放時間戳令牌的TSA伺服器的HTTP或HTTPS端點。
有幾個TSA伺服器是免費提供給測試及低容量生產用的。 http://timestamp.digicert.com是兩個常用的端點。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/timestamp-signature.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfHashAlgorithm;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF to sign with a timestamp
PdfDocument pdf = PdfDocument.fromFile(Path.of("invoice.pdf"));
// Construct the PdfSignature from the certificate file
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set signature metadata
signature.setSigningContact("Finance Team");
signature.setSigningLocation("Seattle, WA");
signature.setSigningReason("Invoice Authorization");
// Configure the timestamp: set the hash algorithm and TSA endpoint
signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256);
signature.setTimestampUrl("https://freetsa.org/tsr");
// Apply the digital signature; IronPDF will contact the TSA to obtain
// and embed a timestamp token alongside the cryptographic signature
pdf.signDigitalSignature(signature);
// Save the timestamped, signed PDF
pdf.saveAs(Path.of("invoice-signed-timestamped.pdf"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/timestamp-signature.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.signature.PdfHashAlgorithm;
import com.ironsoftware.ironpdf.signature.PdfSignature;
public class Main {
public static void main(String[] args) throws IOException {
// Set the IronPDF license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF to sign with a timestamp
PdfDocument pdf = PdfDocument.fromFile(Path.of("invoice.pdf"));
// Construct the PdfSignature from the certificate file
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");
// Set signature metadata
signature.setSigningContact("Finance Team");
signature.setSigningLocation("Seattle, WA");
signature.setSigningReason("Invoice Authorization");
// Configure the timestamp: set the hash algorithm and TSA endpoint
signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256);
signature.setTimestampUrl("https://freetsa.org/tsr");
// Apply the digital signature; IronPDF will contact the TSA to obtain
// and embed a timestamp token alongside the cryptographic signature
pdf.signDigitalSignature(signature);
// Save the timestamped, signed PDF
pdf.saveAs(Path.of("invoice-signed-timestamped.pdf"));
}
}
當簽署時TSA無法連接時,IronPDF將拋出異常; 請在佈署到生產之前檢查網路存取和TSA端點URL。 對於高容量生產工作流程,考慮訂閱商業TSA以保證正常運行時間和吞吐量。
接下來要如何對PDF進行數位簽署?
IronPDF的PdfSignature類涵蓋了PDF簽章需求的全範疇:具有證書元資料的批准簽章、可見的圖形戳記、具有存取控制級別的PDF認證以及TSA支持的長期有效性時間戳。 要擴展您的PDF工作流程超過簽署範疇,請探索以下相關資源:
- 在Java中建立PDF表單:構建可以在PDF認證後完成的填寫表單欄位
- 在Java中填寫PDF表單:以程式方式填寫現有PDF文件中的表單欄位
- 在Java中對PDF新增註解:在特定頁面位置附加評論、高亮和標註
- 在Java中合併PDFs:在應用單一認證簽名之前合併多個文件
- IronPDF for Java範例:提供涵蓋IronPDF Java API完整性的可粘貼程式碼範例
常見問題
如何在Java中使用IronPDF數位簽署PDF?
使用PdfDocument.fromFile()載入您的PDF,使用PFX證書文件的路徑及其密碼建立PdfSignature,可選地使用setSigningContact(),setSigningLocation()和setSigningReason()設置元資料,然後調用pdf.signDigitalSignature(signature)並使用pdf.saveAs()保存。
在IronPDF中signDigitalSignature()和certify()有什麼區別?
signDigitalSignature()新增了一個記錄單個簽名人員批准的批准簽名。可以按順序新增多個批准簽名。certify()新增了一個必須在文件中首先出現的作者簽名,並設置PdfCertificationLevel以控制後續簽名者可以進行哪些更改。
如何在Java中向已簽名的PDF新增可見簽名圖像?
以FileInputStream打開圖像文件,並在調用signDigitalSignature()之前將其傳遞給signature.setSignatureImage(imageStream)。該圖像將嵌入在頁面上的簽名字段中,與加密簽名一起。
IronPDF支持哪些PDF認證級別?
IronPDF通過PdfCertificationLevel枚舉支持三個級別:NO_CHANGES_ALLOWED完全鎖定文件,FORM_FILLING僅允許表單字段輸入,FORM_FILLING_AND_ANNOTATIONS允許表單字段和註釋,同時阻止結構編輯。
如何在Java中向數位簽名新增時間戳?
在PdfSignature上設置signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256)和signature.setTimestampUrl("https://freetsa.org/tsr"),然後調用signDigitalSignature()。IronPDF聯繫TSA伺服器並將時間戳記標籤嵌入到已簽名的PDF中。
IronPDF在簽署PDF時需要什麼格式的證書文件?
IronPDF需要PFX或P12證書文件,這是一種包含私鑰和公共證書的PKCS#12存檔。自簽名證書可以用於開發;對於生產使用,從可信的證書頒發機構如DigiCert或GlobalSign獲取證書。
在Java中使用IronPDF數位簽署PDF的先決條件是什麼?
您需要Java 8或更高版本,通過Maven或Gradle新增IronPDF依賴,使用License.setLicenseKey()設置有效的授權金鑰,以及帶有密碼的PFX或P12證書文件。


