そのため、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);
}
}
私は愚かなことをしているのですか、それとも小さな何かを見逃していますか? 助けてくれてありがとう。
敬具