# 如何在Java中數位簽署PDF
在Java中使用IronPDF對PDF進行數位簽署,讓您可以應用加密簽章來驗證文件的真實性並檢測未經授權的更改。 IronPDF支持`PdfCertificationLevel`控制PDF的認證級別,並連接到時間戳機構伺服器以確保長期簽名有效性。
*as-heading:2(快速入門:在Java中數位簽署PDF)*
1. 透過Maven或Gradle安裝 IronPDF for Java
2. 使用`License.setLicenseKey()`設置您的授權金鑰
3. 使用`PdfDocument.fromFile()`載入PDF
4. 使用您的PFX證書文件和密碼建立`PdfSignature`
5. 使用`signDigitalSignature()`套用簽名
6. 使用`saveAs()`保存已簽署的PDF
```java
: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來處理兩種簽章型別。 有關初步設置、依賴項配置及授權金鑰說明,請參閱[入門概覽](https://ironpdf.com/java/docs/)。
<div class="hsg-featured-snippet">
<h2>如何在Java中數位簽署PDF</h2>
<ol>
<li><a href="https://ironpdf.com/java/#download-modal">安裝IronPDF Java程式庫以進行數位簽署</a></li>
<li>使用 <strong>PdfDocument</strong> 類載入PDF</li>
<li>使用PFX證書文件和密碼建立 <strong>PdfSignature</strong></li>
<li>可選地使用<code>setSignatureImage</code>設置可見的簽名圖片</li>
<li>用<code>signDigitalSignature</code>套用簽名</li>
<li>使用<code>certify</code>和<code>PdfCertificationLevel</code>認證PDF</li>
<li>使用<code>saveAs</code>保存已簽署的PDF</li>
</ol>
</div>
## 開始之前我需要什麼準備?
在使用IronPDF簽署PDF之前,請確認以下先決條件:
- **Java 8 或更高版本**:IronPDF需要JDK版本8或更高。
- **IronPDF for Java**:在您的構建文件中新增此依賴項。在[Maven Central](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf)找到最新版本。
- **有效的授權金鑰**:使用`License.setLicenseKey()`在應用程式啟動時設置金鑰。 有關詳細的設置說明,請存取[授權金鑰指南](https://ironpdf.com/java/get-started/license-keys/)。
- **PFX或P12證書文件**:這是一個受密碼保護的存檔,其中包含您的私鑰和以PKCS#12格式儲存的公共證書。 自簽名證書適用於開發和測試; 對於需要外部接收者信任的生產文件,請使用由受認可的證書機構(CA)如DigiCert、Comodo或GlobalSign頒發的證書。
有關完整的依賴項設置和專案配置,請參閱[入門概覽](https://ironpdf.com/java/docs/)。
## 我如何在PDF上應用數位簽章?
`PdfSignature`構造函式需要您的PFX證書的文件路徑及其密碼。 構造完成後,您可以通過三個設置方法附加可選元資料:
- `setSigningContact(String)`:簽署人的姓名或電子郵件
- `setSigningLocation(String)`:簽署人的物理或組織位置
- `setSigningReason(String)`:文件簽署原因的簡短描述
這些欄位會顯示在PDF檢視器的簽章屬性面板中,為合規性目的建立有用的審核記錄。 在已載入的`saveAs()`保存結果。
```java
//: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)`。 該圖片會嵌入到頁面的簽名欄位中。
```java
//: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()`。
```java
//: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`是兩個常用的端點。
```java
//: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表單](https://ironpdf.com/java/how-to/create-forms/):構建可以在PDF認證後完成的填寫表單欄位
- [在Java中填寫PDF表單](https://ironpdf.com/java/how-to/java-fill-pdf-form-tutorial/):以程式方式填寫現有PDF文件中的表單欄位
- [在Java中對PDF新增註解](https://ironpdf.com/java/examples/annotations/):在特定頁面位置附加評論、高亮和標註
- [在Java中合併PDFs](https://ironpdf.com/java/how-to/java-merge-pdf-tutorial/):在應用單一認證簽名之前合併多個文件
- [IronPDF for Java範例](https://ironpdf.com/java/examples/):提供涵蓋IronPDF Java API完整性的可粘貼程式碼範例
[開始您的免費試用](trial-license),將數位簽章新增到您的Java PDF工作流程。 若要購買商業使用的授權,請[查看授權選項](licensing)。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/quickstart.javaimport 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 keyLicense.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 = newPdfSignature("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")); }}
//: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"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/apply-signature.javaimport 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 keyLicense.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 = newPdfSignature("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"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/visible-signature-image.javaimport 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 keyLicense.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 = newPdfSignature("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 = newFileInputStream("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"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/certify-pdf.javaimport 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 keyLicense.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 = newPdfSignature("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"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/timestamp-signature.javaimport 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 keyLicense.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 = newPdfSignature("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"));
}
}
How do I certify a document with no changes allowed using IronPDF?
To certify a document with no changes allowed, construct a PdfSignature, set any required metadata, and call pdf.certify() with the PdfCertificationLevel.NO_CHANGES_ALLOWED parameter before applying any approval signatures.
What are the benefits of using digital signatures on PDFs with IronPDF?
Digital signatures ensure the authenticity and integrity of a document by creating a cryptographic identity tied to a private key. They are ideal for contracts, invoices, and legal documents, where tamper evidence and verification are crucial.
What next steps are recommended after setting up digital signatures with IronPDF?
After setting up digital signatures, consider exploring related IronPDF functionalities, such as creating and filling PDF forms, adding annotations, and merging PDFs to enhance your Java PDF workflow.