[英]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.