我在Visual Studio上使用iTextSharp。我创建了一个像这样的Pdfannotation:
PdfAnnotation annotation = PdfAnnotation.CreateText(stamper.Writer, rect, "Author", "I write my text", true, "New Paragraph");
stamper.AddAnnotation(annotation, 1);
所以我的注释内容是一个文本"我写了我的文字"。 当我使用Adobe Acrobat Reader打开我的pdf时,当我点击按钮时#34;评论"看到我在pdf上写的所有评论,我看到了我的评论并接近我的评论"我写了我的文字",我看到一个小方块,我可以检查或取消选中。 这是我创建Pdf注释时自动创建的一个小复选框。我自己没有创造它。
我想使用iTextSharp检查或取消选中这个小复选框。
我考虑过这样做,但它不起作用:
RadioCheckField checkbox = new RadioCheckField(stamper.Writer, rect, "bonjour", "on");
checkbox.CheckType = RadioCheckField.TYPE_CHECK;
checkbox.Checked = true;
PdfFormField field = checkbox.CheckField;
annotation.Put(PdfName.A, field);
有谁知道怎么做?
非常感谢你!
祝你有个美好的一天! :)
答案 0 :(得分:0)
由于在文本(或粘滞便笺)注释的上下文中使用术语“检查/取消选中”,这个问题有些混乱。正确的术语应该是:如何标记/取消标记文本注释?
立即检查/取消选中会让我们考虑复选框,但下面的屏幕截图显示了当我们讨论标记文本注释时的含义:
标记文本注释不是检查复选框的问题。通过添加隐藏的“在回复中”(IRT)注释来标记文本注释。有关“回复”注释的详细信息,请参阅官方网站上的How to add an "In Reply To" annotation?。
我已将AddInReplyTo示例与AddMarked作为结果进行了调整:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfDictionary page = reader.getPageN(1);
PdfArray annots = page.getAsArray(PdfName.ANNOTS);
PdfDictionary sticky = annots.getAsDict(0);
PdfArray stickyRect = sticky.getAsArray(PdfName.RECT);
PdfDictionary popup = annots.getAsDict(1);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
PdfWriter writer = stamper.getWriter();
Rectangle stickyRectangle = new Rectangle(
stickyRect.getAsNumber(0).floatValue(), stickyRect.getAsNumber(1).floatValue(),
stickyRect.getAsNumber(2).floatValue(), stickyRect.getAsNumber(3).floatValue()
);
PdfAnnotation replySticky = PdfAnnotation.createText(
writer, stickyRectangle, "Bruno", "Marked set by Bruno", false, "Comment");
replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0));
replySticky.put(PdfName.STATE, new PdfString("Marked"));
PdfNumber n = sticky.getAsNumber(PdfName.F);
replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN));
replySticky.put(new PdfName("StateModel"), new PdfString("Marked"));
stamper.addAnnotation(replySticky, 1);
stamper.close();
}
这个例子是用Java编写的,但它应该很容易适应C#。重要的是要知道标记原始注释sticky
是通过添加额外注释replySticky
来完成的。与普通IRT注释的不同之处在于,我们将通过将FLAGS_HIDDEN
添加到注释的标志来隐藏注释。我们还将/State
设置为Marked
,将/StateModel
设置为Marked
。
此代码会根据请求将hello_sticky_note.pdf变为hello_marked.pdf,但有一个问题!只有以“Bruno”用户身份登录时,该复选框才可见。此复选框仅供个人使用。
如果您希望其他人查看审核状态,则不应使用“已标记”功能。相反,你应该使用“评论”。这在ISO-32000中很少记录。请参阅标题为“特定于文本注释的附加条目”的表:
此表引用标题为“注释状态”的表:
我们使用了组合 StateModel = Marked; State = Marked ,表示注释已由用户标记。我没有在规范中找到任何参考,该标记仅在标记文档的用户的机器上可见。
发现这个后,我创建了AddAccepted示例:
PdfAnnotation replySticky = PdfAnnotation.createText(
writer, stickyRectangle, "Bruno", "Accepted by Bruno", false, "Comment");
replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0));
replySticky.put(PdfName.STATE, new PdfString("Accepted"));
PdfNumber n = sticky.getAsNumber(PdfName.F);
replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN));
replySticky.put(new PdfName("StateModel"), new PdfString("Review"));
stamper.addAnnotation(replySticky, 1);
stamper.close();
此示例与我们之前的示例相同,只是我们现在使用组合: StateModel = Review; State =已接受。从“注释状态”表中可以看出,状态的其他可能选项是“已拒绝”,“已取消”,“已完成”和“无”(这是默认值)。
结果如下:
如您所见,评论面板中会显示绿色复选标记。它在登录用户不是Bruno的计算机上显示“Bruno Accepted”。您可以在此处自行查看:hello_accepted.pdf