由于文本(或便笺)注释上下文中的术语“选中/取消选中”,问题有些混乱。正确的术语应该是:如何标记/取消标记文本注释?
选中/取消选中立即让我们想到复选框,但以下屏幕截图显示了我们谈论标记文本注释时的含义:
标记文本注释不是选中复选框的问题。通过添加隐藏的“回复”(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 中没有得到很好的记录。请参阅标题为“特定于文本注释的其他条目”的表格:
此表指的是标题为“Annotation States”的表:
我们使用了组合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;状态 = 接受。从“Annotation states”表中可以看出,State 的其他可能选项是“Rejected”、“Cancelled”、“Completed”和“None”(这是默认值)。
结果如下:
如您所见,cmets 面板中出现了一个绿色复选标记。它在登录用户不是布鲁诺的计算机上显示“布鲁诺接受”。你可以在这里自己检查:hello_accepted.pdf