Java 給PDF簽名時新增可信時間戳

iceblue發表於2021-07-19

一、程式執行環境

  • 編譯環境:IntelliJ IDEA
  • 所需測試檔案:PDF、.pfx數字證照及金鑰、PDF Jar包(Free Spire.PDF for Java)、簽名圖片(.png格式)
  • 可信時間戳伺服器:URL地址

:以下程式碼中的所有測試檔案路徑均為IDEA程式專案資料夾路徑,如C:\Users\Administrator\IdeaProjects\Certificate_PDF\test.pdf,檔案路徑可自定義。

關於jar匯入可參考如下2種方法:

1.手動匯入:下載jar包到本地,解壓;在IDEA中,執行如下步驟匯入:

 

2. Maven配置匯入。在pom.xml中配置如下內容下載匯入:

<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>4.4.1</version>
    </dependency>
</dependencies>

 

二、程式測試程式碼

import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfImage;
import com.spire.pdf.graphics.PdfTrueTypeFont;
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 TimeStamp {
    public static void main(String[] args) {
        //載入PDF文件
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("test.pdf");

        //載入pfx證照,及證照祕鑰
        PdfCertificate cert = new PdfCertificate("pfx證照","金鑰");

        //新增數字簽名到指定頁面,並設定其位置和大小
        PdfSignature signature = new PdfSignature(pdf, pdf.getPages().get(2), cert, "Mia");
        Rectangle2D rect = new Rectangle2D.Float();
        rect.setFrame(new Point2D.Float((float) pdf.getPages().get(0).getActualSize().getWidth() - 340, (float) pdf.getPages().get(0).getActualSize().getHeight() - 230), new Dimension(280, 120));
        signature.setBounds(rect);

        //設定簽名為圖片加文字模式
        signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);

        //設定簽名的內容
        signature.setNameLabel("簽字人:");
        signature.setName("Manager");
        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("sign.png"));

        //設定簽名的字型
        signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 9)));

        //設定文件許可權為禁止更改
        signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
        signature.setCertificated(true);

        //配置時間戳伺服器
        String timestampeServerUrl = "時間戳伺服器地址";
        signature.configureTimestamp(timestampeServerUrl);

        //儲存文件
        pdf.saveToFile("SignatureWithTimeStamp.pdf");
        pdf.close();
    }
}

 

時間戳效果如圖:

 

相關閱讀推薦:

 

—End—

 

相關文章