如何在Java中數位簽署PDF

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

在Java中使用IronPDF對PDF進行數位簽署,讓您可以應用加密簽章來驗證文件的真實性並檢測未經授權的更改。 IronPDF支持PdfCertificationLevel控制PDF的認證級別,並連接到時間戳機構伺服器以確保長期簽名有效性。

快速入門:在Java中數位簽署PDF

  1. 透過Maven或Gradle安裝 IronPDF for Java
  2. 使用License.setLicenseKey()設置您的授權金鑰
  3. 使用PdfDocument.fromFile()載入PDF
  4. 使用您的PFX證書文件和密碼建立PdfSignature
  5. 使用signDigitalSignature()套用簽名
  6. 使用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"));
    }
}
JAVA

數位簽章為PDF文件提供了一個與私密金鑰和證書相關的加密身份。 當收件人使用Adobe Acrobat或任何相容的檢視器打開已簽署的PDF時,應用程式會驗證證書鏈是否可追溯至受信任的機構,並且文件內容自簽署以來未進行過更改。 這種身份驗證與完整性的結合使數位簽章對於合約、發票、監管申報文件以及任何涉及抵觸證據的文件來說都至關重要。

PDF簽章有兩種型別:批准簽章和作者(認證)簽章。 批准簽章會記錄一個簽署人在某一時刻的批准;多方可以依次新增批准簽章而不會使較早的簽章失效。 認證簽章通過PdfCertificationLevel鎖定文件,並將簽署者標記為文件的作者。 認證簽章必須是文件上的第一個簽章,並管控後續簽署者可以進行的更改(如果有的話)。

IronPDF通過PdfDocument構建的統一API來處理兩種簽章型別。 有關初步設置、依賴項配置及授權金鑰說明,請參閱入門概覽

開始之前我需要什麼準備?

在使用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"));
    }
}
JAVA

signDigitalSignature()完成之後,PDF包含了用PFX文件中的私鑰簽署的文件內容的加密哈希。此時之後對文件的任何修改都將使簽名失效。

Icon Quote related to 我如何在PDF上應用數位簽章?

我最喜歡的程式庫是IronPDF。它允許快速高效地操作PDF文件。它還有許多有價值的功能,例如導出到PDF/A格式和數位簽署PDF文件。

Milan Jovanovic related to 我如何在PDF上應用數位簽章?

Milan Jovanovic

Microsoft MVP

查看案例研究
Icon Quote related to 我如何在PDF上應用數位簽章?

IronOCR意味著我們每年可以從手動處理中節省$40,000,同時提高生產力,釋放資源以進行高影響的任務。我會強烈推薦它。

Brent Matzelle related to 我如何在PDF上應用數位簽章?

Brent Matzelle

首席技術官,OPYN

查看案例研究
Icon Quote related to 我如何在PDF上應用數位簽章?

IronSuite在我們的運營中扮演著至關重要的角色。這些工具增加了包括建立平面圖和改善庫存管理在內的業務效率。

David Jones related to 我如何在PDF上應用數位簽章?

David Jones

首席軟體工程師,Agorus Build

查看案例研究

我如何在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"));
    }
}
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 {
        // 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"));
    }
}
JAVA

一旦用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"));
    }
}
JAVA

當簽署時TSA無法連接時,IronPDF將拋出異常; 請在佈署到生產之前檢查網路存取和TSA端點URL。 對於高容量生產工作流程,考慮訂閱商業TSA以保證正常運行時間和吞吐量。

接下來要如何對PDF進行數位簽署?

IronPDF的PdfSignature類涵蓋了PDF簽章需求的全範疇:具有證書元資料的批准簽章、可見的圖形戳記、具有存取控制級別的PDF認證以及TSA支持的長期有效性時間戳。 要擴展您的PDF工作流程超過簽署範疇,請探索以下相關資源:

開始您的免費試用,將數位簽章新增到您的Java PDF工作流程。 若要購買商業使用的授權,請查看授權選項

常見問題

如何在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證書文件。

Darrius Serrant
全端軟體工程師(WebOps)

Darrius Serrant擁有邁阿密大學的電腦科學學士學位,並在Iron Software擔任全端WebOps行銷工程師。從小就對程式設計有興趣,他認為計算既神秘又易於理解,成為創意和問題解決的完美媒介。

在Iron Software,Darrius喜歡創造新事物並簡化複雜的概念,使其更易於理解。作為我們的常駐開發人員之一,他還志願教學,將他的專業知識傳授給下一代。

對Darrius來說,他的工作是有意義的,因為它有價值且對社會有真正的影響。

準備好開始了嗎?
版本: 2026.6 剛剛發布
Still Scrolling Icon

還在滾動嗎?

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