最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用 Python 對 PDF 文檔進(jìn)行數(shù)字簽名的方法

 更新時間:2026年07月17日 08:36:55   作者:用戶835629078051  
本文將介紹用Python為PDF添加可見簽名、隱藏簽名和帶時間戳的簽名,并對已簽名文檔進(jìn)行驗證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在合同、發(fā)票、報告等文件的流轉(zhuǎn)過程中,如何確認(rèn)文檔確實由某個簽署人發(fā)出,并且在簽署之后沒有被篡改,是一個經(jīng)常遇到的問題。數(shù)字簽名正是為此設(shè)計的機(jī)制:它基于 PKI(公鑰基礎(chǔ)設(shè)施)技術(shù),把簽署人的身份與文檔內(nèi)容綁定在一起,一旦文檔被修改,簽名的校驗就會失敗。

相比手動在 Adobe Acrobat 等工具里逐份簽署,用程序批量處理簽名更適合需要自動化的場景,例如系統(tǒng)自動生成的合同、每日結(jié)算單、審批通過后自動蓋章的流程文件等。本文將介紹如何用 Python 為 PDF 添加可見簽名、隱藏簽名和帶時間戳的簽名,并對已簽名文檔進(jìn)行驗證。

數(shù)字簽名解決的問題

用程序處理數(shù)字簽名,通常出于以下幾方面的考慮:

  • 完整性校驗:簽名后文檔內(nèi)容一旦被改動,驗證會立即失效,可以判斷文件是否被篡改。
  • 身份認(rèn)證:簽名基于持有人的證書(PFX/PKCS#12 文件),能證明文檔由特定主體簽署。
  • 批量自動化:審批系統(tǒng)、結(jié)算系統(tǒng)可以在文件生成時自動完成簽署,無需人工介入。
  • 可長期驗證:結(jié)合時間戳服務(wù),即使簽署證書后續(xù)過期,也能證明簽署發(fā)生在證書有效期內(nèi)。

環(huán)境準(zhǔn)備

處理 PDF 簽名可以使用 Spire.PDF for Python,通過 pip 安裝:

pip install Spire.Pdf

除了庫本身,還需要一個用于簽署的數(shù)字證書文件,通常是 .pfx(或 .p12)格式,并配有對應(yīng)的密碼。證書可以由 CA 機(jī)構(gòu)簽發(fā),也可以在測試階段使用自簽名證書。

添加可見的數(shù)字簽名

可見簽名會在頁面上繪制一個簽名框,顯示簽署人、原因、位置等信息,適合需要讓閱讀者直觀看到"已簽署"狀態(tài)的場景。

核心是 PdfOrdinarySignatureMaker 對象:它接收 PDF 文檔、證書文件路徑和證書密碼,負(fù)責(zé)完成簽署運算。簽名的外觀則通過 PdfSignatureAppearance 單獨配置。

from spire.pdf import *

# 加載 PDF 文檔
doc = PdfDocument()
doc.LoadFromFile("SampleB_1.pdf")

# 使用證書文件和密碼創(chuàng)建簽名生成器
signatureMaker = PdfOrdinarySignatureMaker(doc, "Jerry.pfx", "e-iceblue")

# 配置簽名的元數(shù)據(jù)
signature = signatureMaker.Signature
signature.Name = "Jerry"
signature.ContactInfo = "028-12345678"
signature.Location = "Chengdu"
signature.Reason = "文檔負(fù)責(zé)人簽署"

# 配置簽名外觀
appearance = PdfSignatureAppearance(signature)
appearance.NameLabel = "簽署人: "
appearance.ContactInfoLabel = "聯(lián)系方式: "
appearance.LocationLabel = "地點: "
appearance.ReasonLabel = "原因: "
appearance.SignatureImage = PdfImage.FromFile("logo.png")
appearance.GraphicMode = GraphicMode.SignImageAndSignDetail

# 在第一頁指定位置繪制簽名框:x, y, 寬, 高
signatureMaker.MakeSignature("Signer:", doc.Pages.get_Item(0), 90.0, 550.0, 270.0, 90.0, appearance)

doc.SaveToFile("DigitalSignature.pdf")
doc.Dispose()

這里有幾個關(guān)鍵點值得說明:

  • Signature 屬性上設(shè)置的 Name、Reason、Location 等信息會被寫入簽名對象,PDF 閱讀器在展示簽名詳情時會讀取它們。
  • GraphicMode 決定簽名框里顯示什么內(nèi)容。SignImageAndSignDetail 表示同時顯示圖片(如公司 Logo)和文字信息;也可以只顯示圖片或只顯示文字。
  • MakeSignature 的坐標(biāo)參數(shù)以點(point)為單位,原點在頁面左下角。最后四個數(shù)字分別對應(yīng)簽名框的左邊界、下邊界、寬度和高度。

添加隱藏簽名

有些場景并不希望在頁面上出現(xiàn)簽名框,只需要在文檔層面完成簽署以保證完整性即可。這時可以創(chuàng)建不帶外觀參數(shù)的隱藏簽名。

from spire.pdf import *

doc = PdfDocument()
doc.LoadFromFile("SampleB_1.pdf")

# 創(chuàng)建簽名生成器
signatureMaker = PdfOrdinarySignatureMaker(doc, "Jerry.pfx", "e-iceblue")

# 只傳簽名字段名稱,不設(shè)置外觀,即為隱藏簽名
signatureMaker.MakeSignature("signName")

doc.SaveToFile("AddInvisibleSignature.pdf")
doc.Dispose()

隱藏簽名同樣具備防篡改能力,閱讀器仍能在簽名面板中檢測到它,只是頁面上不顯示任何可見標(biāo)記。

添加帶時間戳的簽名

數(shù)字證書都有有效期。如果需要證明"簽署行為發(fā)生在證書仍然有效的時間點",就要引入可信時間戳服務(wù)(TSA)。Security_PdfSignature 提供了 ConfigureTimestamp 方法來指定 TSA 服務(wù)地址。

from spire.pdf import *

doc = PdfDocument()
doc.LoadFromFile("SampleB_1.pdf")

# 創(chuàng)建帶頁面引用的簽名對象
signature = Security_PdfSignature(doc, doc.Pages.get_Item(0), "Jerry.pfx", "e-iceblue", "signature")

# 設(shè)置簽名框的位置和大小
signature.Bounds = RectangleF(PointF(90.0, 550.0), SizeF(180.0, 90.0))
signature.NameLabel = "Digitally signed by: Jerry"
signature.Reason = "確保文檔真實性"

# 限制簽署后允許的操作:僅允許填寫表單,禁止其他修改
signature.DocumentPermissions = PdfCertificationFlags.AllowFormFill.value | PdfCertificationFlags.ForbidChanges.value

# 配置可信時間戳服務(wù)
signature.ConfigureTimestamp("https://freetsa.org/tsr")

doc.SaveToFile("SignedByTimestamp.pdf")
doc.Dispose()

DocumentPermissions 是這里的一個實用屬性,它以證書化簽名的方式限定簽署后允許的操作。示例中的組合表示"允許繼續(xù)填寫表單字段,但禁止其他任何改動",適合審批完成后仍需收集信息、又要防止內(nèi)容被篡改的表單類文檔。

驗證已簽名的文檔

拿到一份簽名文檔后,可以遍歷其表單中的簽名字段,逐個校驗簽名是否有效。

from spire.pdf import *

doc = PdfDocument()
doc.LoadFromFile("SignedDocument.pdf")

# 訪問文檔表單
formWidget = PdfFormWidget(doc.Form)

if formWidget.FieldsWidget.Count > 0:
    for i in range(formWidget.FieldsWidget.Count):
        field = formWidget.FieldsWidget.get_Item(i)
        if isinstance(field, PdfField):
            signatureField = PdfSignatureFieldWidget(field)
            # 用字段全名驗證對應(yīng)簽名
            valid = doc.VerifySignature(signatureField.FullName)
            print("簽名有效" if valid else "簽名無效")

doc.Dispose()

VerifySignature 會重新計算文檔內(nèi)容的摘要并與簽名中記錄的值比對:如果文檔在簽署之后被改動,返回結(jié)果就是無效。這一步是數(shù)字簽名"防篡改"承諾的最終落地。

實用建議

  • 證書密碼不要硬編碼:示例中為了演示直接寫在代碼里,實際項目應(yīng)從環(huán)境變量或密鑰管理服務(wù)讀取。
  • 坐標(biāo)系統(tǒng):簽名框坐標(biāo)以頁面左下角為原點,向上為 y 正方向,與常見的屏幕坐標(biāo)相反,放置時注意換算。
  • 簽名順序:一份文檔可以有多個簽名。后簽署的簽名會把先前的簽名內(nèi)容一并納入校驗范圍,因此簽署順序會影響驗證邏輯。
  • 及時釋放資源:處理完成后調(diào)用 Dispose() 釋放文檔占用的句柄,避免批量任務(wù)中文件被占用。

總結(jié)

本文圍繞 PDF 數(shù)字簽名的常見需求,介紹了可見簽名、隱藏簽名、帶時間戳簽名以及簽名驗證四種操作。它們的核心都建立在證書文件與文檔內(nèi)容的綁定之上:PdfOrdinarySignatureMaker 負(fù)責(zé)普通簽署,Security_PdfSignature 在此基礎(chǔ)上補(bǔ)充了時間戳和權(quán)限控制,而 VerifySignature 則完成校驗閉環(huán)。

在此基礎(chǔ)上,可以進(jìn)一步結(jié)合表單字段、文檔權(quán)限和長期驗證(LTV)等能力,構(gòu)建出適合合同管理、審批流轉(zhuǎn)等場景的自動化簽署方案。

到此這篇關(guān)于使用 Python 對 PDF 文檔進(jìn)行數(shù)字簽名的方法的文章就介紹到這了,更多相關(guān)Python PDF數(shù)字簽名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python time.strptime格式化實例詳解

    python time.strptime格式化實例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python time.strptime格式化實例詳解內(nèi)容,對此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • pytorch查看torch.Tensor和model是否在CUDA上的實例

    pytorch查看torch.Tensor和model是否在CUDA上的實例

    今天小編就為大家分享一篇pytorch查看torch.Tensor和model是否在CUDA上的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • pytorch模型訓(xùn)練的時候GPU使用率不高的問題

    pytorch模型訓(xùn)練的時候GPU使用率不高的問題

    這篇文章主要介紹了pytorch模型訓(xùn)練的時候GPU使用率不高的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python模擬鼠標(biāo)點擊實現(xiàn)方法(將通過實例自動化模擬在360瀏覽器中自動搜索python)

    Python模擬鼠標(biāo)點擊實現(xiàn)方法(將通過實例自動化模擬在360瀏覽器中自動搜索python)

    這篇文章主要介紹了Python模擬鼠標(biāo)點擊實現(xiàn)方法(將通過實例自動化模擬在360瀏覽器中自動搜索python),需要的朋友可以參考下
    2017-08-08
  • GraphQL在Django中的使用教程

    GraphQL在Django中的使用教程

    這篇文章主要介紹了GraphQL在Django中的使用教程,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Django中軟刪除的具體實現(xiàn)

    Django中軟刪除的具體實現(xiàn)

    軟刪除是一種數(shù)據(jù)庫策略,通過標(biāo)記字段而非實際刪除數(shù)據(jù),下面就來介紹一下如何實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-11-11
  • 使用pycharm連接讀取orcl數(shù)據(jù)庫的表的操作方法

    使用pycharm連接讀取orcl數(shù)據(jù)庫的表的操作方法

    這篇文章主要介紹了使用pycharm連接讀取orcl數(shù)據(jù)庫的表的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • python PaddleSpeech實現(xiàn)嬰兒啼哭識別

    python PaddleSpeech實現(xiàn)嬰兒啼哭識別

    這篇文章主要為大家介紹了python PaddleSpeech實現(xiàn)嬰兒啼哭識別操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Python與MongoDB輕松管理數(shù)據(jù)

    Python與MongoDB輕松管理數(shù)據(jù)

    本文將介紹如何使用Python操作MongoDB,包括安裝MongoDB、安裝Python的MongoDB驅(qū)動程序、連接到MongoDB、插入、查詢、更新和刪除數(shù)據(jù),以及示例代碼
    2023-11-11
  • Numpy中vstack()和hstack()的使用方式

    Numpy中vstack()和hstack()的使用方式

    文章詳細(xì)介紹了Numpy中vstack()和hstack()兩種數(shù)組拼接方法,vstack()是垂直堆疊數(shù)組,需保證除第一軸(行)外,數(shù)組形狀相同,hstack()是按順序堆疊數(shù)組,需保證除第二軸(列)外,數(shù)組形狀相同,兩者都可通過堆疊給定數(shù)組最后形成至少二維的數(shù)組
    2024-10-10

最新評論

上虞市| 新疆| 延寿县| 日土县| 富锦市| 彭泽县| 布拖县| 都江堰市| 平邑县| 台前县| 漳州市| 永丰县| 缙云县| 汉沽区| 江北区| 永寿县| 克拉玛依市| 揭阳市| 日土县| 芮城县| 昭觉县| 叶城县| 武陟县| 枝江市| 水富县| 曲麻莱县| 新昌县| 许昌县| 岑溪市| 乌兰察布市| 禄丰县| 德江县| 平遥县| 朝阳县| 香河县| 措勤县| 乌拉特后旗| 慈溪市| 鹿邑县| 沾益县| 清丰县|