簡體   English   中英

itext 5 創建 PDF1.4 而不是 PDF/A

[英]itext 5 creates PDF1.4 not PDF/A

我目前正在處理一個過時的項目,該項目簽署 PDF/A 並嘗試升級其依賴項。 這里相關的是 co.lowagie.itext 我從 1.4 升級到 5.5.13.1。 由於刪除了 function PdfSignatureAppearance.setCrypto() ,因此發生了很多變化。 我在這個問題中實現了修復(我在最新版本中實現了所需的 jars)問題,現在我得到了這個代碼:

PdfStamper stp;
            try {

                stp = PdfStamper.createSignature(reader, fout, '\0');
                PdfSignatureAppearance sap = stp.getSignatureAppearance();
                ExternalDigest digest = new BouncyCastleDigest();
                BouncyCastleProvider provider = new BouncyCastleProvider();
                Security.addProvider(provider);
                ExternalSignature signature = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName());
                MakeSignature.signDetached(sap, digest, signature, certificateChain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
                stp.close();
            }

為了比較,這里是舊代碼:

PdfStamper stp;
            try {
                stp = PdfStamper.createSignature(reader, fout, '\0');
                PdfSignatureAppearance sap = stp.getSignatureAppearance();
                sap.setCrypto(privateKey, certificateChain, null, PdfSignatureAppearance.WINCER_SIGNED);
                stp.close();
            }

這是我的問題出現的地方。 在測試過程中,我注意到這個新版本將 PDF/A 轉換為舊版本沒有的 PDF1.4。 我對 PDF 或 PDF 簽名沒有經驗。

PDF/A-1 是 PDF-1.4 的配置文件。 因此,如果您的源 PDF 是 PDF/A-1,那么它也是 PDF-1.4 開始,並且 iText 沒有改變它。

此外,舊的 iText 1.4 和新的 iText 5.5.13 PdfStamper是 PDF/A 感知的。 很可能您檢查由 iText 1.4 簽名的 PDF 的配置文件的測試根本沒有認識到這一點。

In case of iText 5.5.13, though, you may have luck because in that version iText also provides a PdfAStamper which is PDF/A-aware (this class is in a separate jar, though, itext-pdfa.jar).

因此,請使用PdfAStamper而不是PdfStamper 如果這仍然沒有幫助,請在使用新舊 iText 版本進行簽名之前和之后為您的輸入 PDF 共享一個示例 PDF/A 文件代表。 並提及您使用哪個程序來確定 PDF 是否為 PDF/A...

有 2 個問題阻礙了代碼創建有效的 PDF/A

第一個問題是,我沒有使用PdfAStamper class 來標記 PDF/A 並保持其 PDF/A 有效性。

第二個問題是,簽名的 PDF/A 需要一個簽名,其中時間戳由外部 tsa 服務器設置。

PdfStamper stp;
            try {

                stp = PdfAStamper.createSignature(reader, fout, '\0',  PdfAConformanceLevel.PDF_A_1A); //<-- PdfAStamper with the PdfAConformanceLevel.
                TSAClient tsaClient = new TSAClientBouncyCastle("https://freetsa.org/tsr"); //<-- creating the TSAClient
                PdfSignatureAppearance sap = stp.getSignatureAppearance();
                ExternalDigest digest = new BouncyCastleDigest();
                BouncyCastleProvider provider = new BouncyCastleProvider();
                Security.addProvider(provider);
                ExternalSignature signature = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName());
                MakeSignature.signDetached(sap, digest, signature, certificateChain, null, null, tsaClient, 0, MakeSignature.CryptoStandard.CMS); //<-- Notice "tsaClient"
                stp.close();
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM