2

そのため、PDF/A-1A ドキュメントに署名しようとしています。ドキュメントは ITextSharp を使用して生成されました。ドキュメントに署名してドキュメントを検証しようとすると、次のエラーが表示されます。

適合レベル pdfa-1a のファイル「test_pdfA_compliance_signed.pdf」を検証しています 必要な XMP プロパティ 'pdfaid:part' がありません。必要な XMP プロパティ 'pdfaid:conformance' がありません。文字列が 65535 バイトを超えています。ドキュメントは要求された標準に準拠していません。ドキュメントが PDF リファレンスに準拠していません (必要なエントリがない、値の型が間違っているなど)。ドキュメントのメタ データが見つからないか、一貫性がないか、破損しています。終わり。

署名済みドキュメント: https://drive.google.com/file/d/0B9RyqgJoa6W8UDFSeHJSX09QamM/view?usp=sharing

署名済み文書: https://drive.google.com/file/d/0B9RyqgJoa6W8Y3lGbFU4a2RsLWc/view?usp=sharing

しかし、署名プロセスは期待どおりに完了しましたが、ドキュメントが PDF/A 準拠であると主張しているかどうかをテストすると、PDF/A を主張するメタデータがないかのように失敗することがわかりました。

private bool CreatePdfStamperIsPDFADocument(PdfReader reader)
    {
        if (reader.Metadata != null && reader.Metadata.Length > 0)
        {
            IXmpMeta xmpMeta = XmpMetaParser.Parse(reader.Metadata, null);
            IXmpProperty pdfaidConformance = xmpMeta.GetProperty(XmpConst.NS_PDFA_ID, "pdfaid:conformance");
            IXmpProperty pdfaidPart = xmpMeta.GetProperty(XmpConst.NS_PDFA_ID, "pdfaid:part");

            if (pdfaidConformance == null || pdfaidPart == null)
            {
                return false;
            }
        }

        return true;
    }

ドキュメントに署名するために使用したコード、ここで使用した PDF スタンパーは、チェックが失敗したため通常のものです。PDFAStamper を使用しようとすると、使用できるのは PDF/A ドキュメントのみであると不平を言います。

private byte[] SignDocument(Certificate certificate, SigningInformation information, List<SigningBlock> signingBlocks, List<MemberItemSignature> signatureImages, byte[] document, bool certify)
    {
        for (int i = 0; i < signingBlocks.Count; i++)
        {
            using (MemoryStream outputStream = new MemoryStream())
            {
                using (PdfReader reader = new PdfReader(document))
                {
                    using (PdfStamper stamper = CreatePdfStamper(reader, outputStream, true))
                    {
                        SigningBlock signingBlock = signingBlocks[i];
                        PdfSignatureAppearance appearance = CreatePdfAppearance(stamper, information, certify && i == 0);

                        SignDocumentSigningBlock(certificate, information, signingBlock, appearance, stamper, GetSignatureImage(signatureImages, signingBlock.Name));
                    }
                }

                document = outputStream.ToArray();
            }
        }

        return document;
    }

これは、使用する PDF スタンパーを決定するコードですが、PDF/A クレームを決定するために使用する両方のコンポーネントに対して、使用しているドキュメントが null を返すため、失敗する場所です。

        private PdfStamper CreatePdfStamper(PdfReader reader, MemoryStream outputStream, bool isSignature)
    {
        if (isSignature)
        {
            if (CreatePdfStamperIsPDFADocument(reader))
            {
                return PdfAStamper.CreateSignature(reader, outputStream, _pdfVersion, null, true, PdfAConformanceLevel.PDF_A_1A);
            }
            else
            {
                return PdfStamper.CreateSignature(reader, outputStream, _pdfVersion, null, true);
            }
        }
        else
        {
            return new PdfStamper(reader, outputStream, _pdfVersion, true);
        }
    }

私は愚かなことをしているのですか、それとも小さな何かを見逃していますか? 助けてくれてありがとう。

敬具

4

1 に答える 1