ITextsharp得到"至少一个签名需要验证"添加注释后

时间:2015-12-11 08:12:28

标签: c# pdf itextsharp

我想使用ITextsharp将注释自由文本添加到签名的PDF中。将注释添加到PDF并在adobe reader中打开后,它将显示消息" 至少一个签名需要验证... "在操作上。如果我使用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();
        }

1 个答案:

答案 0 :(得分:1)

问题是不是,正如我首先假设的那样,文档中存在的签名禁止添加注释。

相反,问题在于Adobe Reader(我使用Adobe Acrobat Reader DC版本2015.009.20079测试)只识别注释(然后在签名后接受它们作为允许的更改),如果它们满足一些额外的标准。

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

  

RC 文字字符串   或文字   流   (可选; PDF 1.5)富文本字符串(请参阅12.7.3.4,“富文本字符串”)   这将用于生成注释的外观。

     

(表174 - 特定于自由文本注释的附加条目 - 在ISO 32000-1中)

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

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>"));

如果没有它,Reader会像这样显示PDF:

annotated sample PDF, original code

......和它一样:

annotated sample PDF, enhanced code

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