如何在 Java 中對 PDF 進行數位簽名

This article was translated from English: Does it need improvement?
Translated
View the article in English

透過 IronPDF for Java 在 Java 中對 PDF 進行數位簽名,可讓您套用加密簽名來驗證文件真實性,並偵測未經授權的變更。 IronPDF 支援 PdfSignature,可將基於 PFX 憑證的簽名附加至任何 PDF 檔案、設定可見的簽名圖像、透過 PdfCertificationLevel 控制 PDF 憑證等級,並連線至時間戳記授權機構 (TMA) 伺服器以確保簽名的長期有效性。

快速入門:在 Java 中對 PDF 進行數位簽名

  1. 透過 Maven 或 Gradle 安裝 IronPDF for Java
  2. 使用 License.setLicenseKey() 設定您的授權金鑰
  3. 載入 PDF 檔案 PdfDocument.fromFile()
  4. 使用您的 PFX 憑證檔案和密碼建立 PdfSignature
  5. 請在結尾處加入簽名檔 signDigitalSignature()
  6. 儲存已簽署的 PDF 檔案 saveAs()

```java :title=快速入門 //: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 { // 設定 IronPDF 授權金鑰 License.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

    // 載入現有的 PDF 文件
    PdfDocument pdf = PdfDocument.fromFile(Path.of("document.pdf"));

    // 使用 PFX 憑證檔案及其密碼建立 PdfSignature
    PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

    // 設定稽核追蹤的簽章元資料
    signature.setSigningContact("John Smith");
    signature.setSigningLocation("New York");
    signature.setSigningReason("文件核准");

    // 將數位簽章套用至 PDF
    pdf.signDigitalSignature(signature);

    // 將已簽署的 PDF 儲存至新檔案
    pdf.saveAs(Path.of("signed.pdf"));
}

}


數位簽章為 PDF 文件提供一種與私密金鑰及憑證綁定的加密身分識別。 當收件者在 Adobe Acrobat 或任何相容的檢視器中開啟簽署過的 PDF 時,應用程式會驗證憑證鏈是否可追溯至受信任的憑證機構,並確認文件內容自簽署以來未曾變更。 這種結合了驗證與完整性的特性,使得數位簽章對於合約、發票、監管申報文件,以及任何需要防篡改證據的文件而言,都至關重要。

PDF 簽名可分為兩大類:核准簽名與作者(認證)簽名。 核准簽名記錄了某位簽署人在特定時間點的核准;多個當事人可依序添加核准簽名,而不會使先前的簽名失效。 使用 `certify()` 套用的認證簽章,會依據 `PdfCertificationLevel` 鎖定文件,並將簽署者標記為文件作者。 認證簽名必須是文件上的第一個簽名,並控制後續簽署者(如有)可進行的變更範圍。

IronPDF 透過基於 `PdfSignature` 和 `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 for 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 檢視器的簽名屬性面板中,並為合規目的建立有用的稽核紀錄。 在載入的 `PdfDocument` 上呼叫 `signDigitalSignature(PdfSignature)` 以嵌入加密簽名,然後使用 `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 {
        // 設定 IronPDF 授權金鑰
        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 閱讀器的簽名面板檢查時才顯示。

若要新增可見圖片,請將圖片檔案以 FileInputStream 格式開啟,並在呼叫 signDigitalSignature() 之前將其傳遞給 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 {
        // 設定 IronPDF 授權金鑰
        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 {
        // 設定 IronPDF 授權金鑰
        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"));
    }
}
JAVA

簽名圖像並不能取代加密保護; 圖形印章與底層憑證均仍為簽署輸出的一部分。 簽名圖片支援 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 {
        // 設定 IronPDF 授權金鑰
        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 {
        // 設定 IronPDF 授權金鑰
        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"));
    }
}
JAVA

一旦通過 NO_CHANGES_ALLOWED 認證,任何修改 PDF 的嘗試都會破壞認證簽名,PDF 檢視器將顯示警告訊息。 當經認證的文件需由下游接收者填寫或註記,且不影響作者認證效力時,請選擇 FORM_FILLINGFORM_FILLING_AND_ANNOTATIONS

如何在數位簽名中加入時間戳記?

時間戳權威 (TSA) 伺服器會提供一個經加密簽署的時間代幣,該代幣將與簽名一同嵌入 PDF 文件中。 此時間戳記證明了簽名所施加的時間,與簽署者的本地時鐘無關。 長期有效性取決於時間戳記:即使簽名憑證已過期,可信賴的時間戳記仍能讓驗證者確認該簽名是在憑證仍有效期間所建立的。

若要啟用時間戳記功能,請在簽署前於 PdfSignature 物件上設定兩個屬性:

  • setTimestampHashAlgorithm(PdfHashAlgorithm):指定計算時間戳記代碼時應使用的雜湊演算法。 PdfHashAlgorithm.SHA256 是標準選項。
  • setTimestampUrl(String):TSA 伺服器的 HTTP 或 HTTPS 端點,該端點將發出時間戳記憑證。

有多台 TSA 伺服器可供免費測試及小規模生產使用。 https://freetsa.org/tsrhttp://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 {
        // 設定 IronPDF 授權金鑰
        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 {
        // 設定 IronPDF 授權金鑰
        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"));
    }
}
JAVA

若在簽署時無法取得 TSA,IronPDF 將拋出例外; 在部署至生產環境前,請先驗證網路連線及 TSA 端點 URL。 若需處理大量生產工作流程,建議訂閱商業版 TSA 服務,以確保系統正常運作時間與處理量。

在 Java 中對 PDF 進行數位簽名的下一步該怎麼做?

IronPDF 的 PdfSignature 類別涵蓋了所有 PDF 簽名需求:包含憑證元資料的核准簽名、可見的圖形印章、具備存取控制層級的 PDF 認證,以及具備長期有效性的 TSA 背書時間戳記。 若要將您的 PDF 工作流程擴展至簽署以外的用途,請探索以下相關資源:

立即開始免費試用,將數位簽章整合至您的 Java PDF 工作流程中。 如需購買用於生產環境的授權,請查看授權選項

常見問題

如何在 Java 中使用 IronPDF 对 PDF 进行數位簽名?

使用PDF/A格式 PdfDocument.fromFile(),建立一個 PdfSignature ,並使用您的 PFX 憑證檔案路徑及其密碼,可選用 setSigningContact(), setSigningLocation(),並 setSigningReason(),接著呼叫 pdf.signDigitalSignature(signature) 並節省儲存為 pdf.saveAs().

IronPDF 中的 signDigitalSignature() 與 certify() 有什麼區別?

signDigitalSignature() 新增一項核准簽名,用以記錄一位簽署人的核准。可依序新增多項核准簽名。 certify() 新增作者簽名,該簽名必須位於文件最前端,並設定 PdfCertificationLevel 控制後續簽署者可進行的變更。

如何在 Java 中將可見的簽名圖片新增至已簽署的 PDF 檔案?

將圖像檔案以 FileInputStream 並將其傳遞給 signature.setSignatureImage(imageStream) ,然後呼叫 signDigitalSignature()之前,請先將圖像檔案以格式開啟並傳遞給。該圖像將與加密簽名一同嵌入頁面上的簽名欄位中。

IronPDF 支援哪些 PDF 認證等級?

IronPDF 透過 PdfCertificationLevel enum 提供三種安全等級: NO_CHANGES_ALLOWED 會完全鎖定文件, FORM_FILLING 僅允許表單欄位輸入,以及 FORM_FILLING_AND_ANNOTATIONS 允許表單欄位與註解,同時禁止結構性編輯。

如何在 Java 中為數位簽章添加時間戳記?

設定 signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256)signature.setTimestampUrl("https://freetsa.org/tsr")PdfSignature 上設定 signDigitalSignature()之前,請先設定和。IronPDF 會聯繫 TSA 伺服器,並將時間戳記代碼嵌入已簽署的 PDF 中。

IronPDF 進行 PDF 簽名時需要哪種憑證檔案格式?

IronPDF 需要 PFX 或 P12 憑證檔案,這是一種包含私密金鑰與公開憑證的 PKCS#12 存檔。開發階段可使用自簽名憑證;若用於生產環境,請向 DigiCert 或 GlobalSign 等受信任的憑證授權機構 (CA) 取得憑證。

在 Java 中使用 IronPDF 對 PDF 進行數位簽名有哪些先決條件?

您需要 Java 8 或更高版本、透過 Maven 或 Gradle 加入的 IronPDF 依賴項、一組有效的授權金鑰(設定為 License.setLicenseKey(),以及附帶密碼的 PFX 或 P12 憑證檔案。

Curtis Chau
技術撰稿人

Curtis Chau 擁有卡爾頓大學(Carleton University)的電腦科學學士學位,專精於前端開發,並精通 Node.js、TypeScript、JavaScript 及 React。他熱衷於打造直觀且美觀的用戶介面,喜歡運用現代框架,並創建結構完善、視覺上吸引人的手冊。

除了開發工作之外,Curtis 對物聯網(IoT)抱有濃厚興趣,致力於探索整合硬體與軟體的創新方法。閒暇時,他喜歡玩遊戲和開發 Discord 機器人,將對科技的熱愛與創意相結合。

準備開始了嗎?
版本: 2026.5 just released
Still Scrolling Icon

還在捲動嗎?

想要快速證明?
執行範例 觀看您的 HTML 變成 PDF。