我想使用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();
}
答案 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:
......和它一样:
如您所见,只有在添加 RC 值后,Reader才会在签名面板上显示注释。