C# ITextsharp get";至少有一个签名需要验证";添加注释后

C# ITextsharp get";至少有一个签名需要验证";添加注释后,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我想使用ITextsharp将无注释文本添加到签名PDF中。将注释添加到PDF并在adobe reader中打开后,它将在op上显示消息“至少一个签名需要验证…”。如果我使用adobe reader将注释添加到已签名的PDF中,它将不会显示消息 这是我的C#代码,使用的是itextsharp 5.5.8 using (var ms = new MemoryStream()) { PdfReader reader = new PdfReader(file)

我想使用ITextsharp将无注释文本添加到签名PDF中。将注释添加到PDF并在adobe reader中打开后,它将在op上显示消息“至少一个签名需要验证…”。如果我使用adobe reader将注释添加到已签名的PDF中,它将不会显示消息

这是我的C#代码,使用的是itextsharp 5.5.8

using (var ms = new MemoryStream())
        {

            PdfReader reader = new PdfReader(file);
            PdfStamper stamper = new PdfStamper(reader, ms, '\0', true);

            Rectangle annotRect = new Rectangle(100, 100, 150, 150);

            PdfContentByte canvas = new iTextSharp.text.pdf.PdfContentByte(stamper.Writer);

            BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\mingliu.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            canvas.SetColorFill(BaseColor.RED);
            canvas.SetColorStroke(BaseColor.RED);

            PdfAnnotation annotation = PdfAnnotation.CreateFreeText(stamper.Writer, annotRect, "test", canvas);

            annotation.Flags = PdfAnnotation.FLAGS_READONLY | PdfAnnotation.FLAGS_LOCKED | PdfAnnotation.FLAGS_PRINT;


            PdfDate pdfdate = new PdfDate();
            annotation.Title = "test";
            annotation.Put(PdfName.CREATIONDATE, pdfdate);
            annotation.Put(PdfName.M, pdfdate);
            stamper.AddAnnotation(annotation, 1);

            stamper.Close();
            reader.Close();
            return ms.ToArray();
        }
问题不在于,正如我第一次假设的那样,要盖章的文档中存在的签名禁止添加注释

相反,这里的问题是,Adobe Reader(我使用Adobe Acrobat Reader DC版本2015.009.20079进行了测试)只会识别注释(然后在签名后将其作为允许的更改接受),如果它们满足一些额外的条件

通过反复试验,我发现如果我提供可选的RC注释字典条目,我可以让读者识别您的自由文本注释。根据规范:

RC文本字符串 或文本 流动 (可选;PDF 1.5)富文本字符串(见12.7.3.4,“富文本字符串”) 用于生成注释外观的

(表174–特定于自由文本注释的附加条目-in)

我这样添加了它(借用我使用Acrobat创建的文本注释):

annotation=pdfanotation.CreateFreeText(stamper.Writer,annotRect,“test”,canvas);
annotation.Put(PdfName.RC,新的PdfString(“

test

”);
如果没有该选项,阅读器将显示PDF,如下所示:

。。。像这样:


如您所见,只有在添加RC值后,阅读器才会在签名面板上显示批注。

根据签名的类型,可能会禁止添加批注。因此,请分享一个签名的PDF样本,用它可以复制这个问题。谢谢Mkl,文件在>谢谢Mkl,它是为我工作,并感谢您的规范文件。这份文件对我很有帮助。非常感谢你!我还有一个关于中文内容的问题。如果我输入中文内容(測試) 对于注释,即使我将字体系列设置为MingLiU或AdobeMingStd Light,它也无法显示内容,因为这是一个不同的问题(而不是如何在不破坏签名的情况下进行注释现在如何使用中文内容进行注释),请自行将其作为stackoverflow问题。此外,请在该问题中提供复制此新问题所需的源代码和数据。
annotation = PdfAnnotation.CreateFreeText(stamper.Writer, annotRect, "test", canvas);

annotation.Put(PdfName.RC, new PdfString("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:9.5.5\" xfa:spec=\"2.0.2\"  style=\"font-size:12.0pt;text-align:left;color:#FF0000;font-weight:normal;font-style:normal;font-family:Helvetica,sans-serif;font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-family:Helvetica\">test</span></p></body>"));