我如何 mark/unmark,使用 iTextSharp C# 编写文本注释 Accepted/Rejected/Cancelled
How do I mark/unmark, write as Accepted/Rejected/Cancelled a text annotation using iTextSharp C#
我正在 Visual Studio 上使用 iTextSharp。我创建了一个这样的 Pdfannotation:
PdfAnnotation annotation = PdfAnnotation.CreateText(stamper.Writer, rect, "Author", "I write my text", true, "New Paragraph");
stamper.AddAnnotation(annotation, 1);
所以我的注释包含一个文本 "I write my text"。
当我继续使用 Adobe Acrobat Reader 打开我的 pdf 时,当我单击按钮 "Comment" 以查看我在 pdf 上写的所有评论时,我会看到我的评论和评论附近 "I write my text",我看到一个可以选中或取消选中的小方块。
这是我创建 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);
有人知道怎么做吗?
非常感谢!
祝你有美好的一天! :)
由于文本(或便利贴)注释上下文中的术语 "check/uncheck",问题有些混乱。正确的术语应该是:How to I mark/unmark a text annotation?
Checking/unchecking 立即让我们想到复选框,但下面的屏幕截图显示了我们谈论标记文本注释时的含义:
标记文本注释不是选中复选框的问题。标记文本注释是通过添加隐藏的 "In Reply To" (IRT) 注释来完成的。有关 "In Reply To" 注释的更多信息,请参阅官方网站上的 How to add an "In Reply To" annotation?。
我修改了 AddInReplyTo example with the 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 into hello_marked.pdf,但有一个问题!该复选框仅在您以用户 "Bruno" 身份登录时可见。此复选框仅供个人使用。
如果您希望其他人看到评论状态,则不应使用 "Marked" 功能。相反,您应该使用 "Review"。这在 ISO-32000 中的记录很少。请参阅标题为 "Additional entries specific to a text annotation" 的 table:
这个table指的是标题为"Annotation States"的table:
我们使用了组合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" table 中可以看出,其他可能的状态选项是 "Rejected"、"Cancelled"、"Completed" 和 "None"(这是默认值)。
结果如下所示:
如您所见,评论面板中出现了一个绿色的复选标记。它在登录用户不是 Bruno 的计算机上显示 "Bruno Accepted"。你可以在这里自己检查一下:hello_accepted.pdf
我正在 Visual Studio 上使用 iTextSharp。我创建了一个这样的 Pdfannotation:
PdfAnnotation annotation = PdfAnnotation.CreateText(stamper.Writer, rect, "Author", "I write my text", true, "New Paragraph");
stamper.AddAnnotation(annotation, 1);
所以我的注释包含一个文本 "I write my text"。 当我继续使用 Adobe Acrobat Reader 打开我的 pdf 时,当我单击按钮 "Comment" 以查看我在 pdf 上写的所有评论时,我会看到我的评论和评论附近 "I write my text",我看到一个可以选中或取消选中的小方块。 这是我创建 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);
有人知道怎么做吗?
非常感谢!
祝你有美好的一天! :)
由于文本(或便利贴)注释上下文中的术语 "check/uncheck",问题有些混乱。正确的术语应该是:How to I mark/unmark a text annotation?
Checking/unchecking 立即让我们想到复选框,但下面的屏幕截图显示了我们谈论标记文本注释时的含义:
标记文本注释不是选中复选框的问题。标记文本注释是通过添加隐藏的 "In Reply To" (IRT) 注释来完成的。有关 "In Reply To" 注释的更多信息,请参阅官方网站上的 How to add an "In Reply To" annotation?。
我修改了 AddInReplyTo example with the 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 into hello_marked.pdf,但有一个问题!该复选框仅在您以用户 "Bruno" 身份登录时可见。此复选框仅供个人使用。
如果您希望其他人看到评论状态,则不应使用 "Marked" 功能。相反,您应该使用 "Review"。这在 ISO-32000 中的记录很少。请参阅标题为 "Additional entries specific to a text annotation" 的 table:
这个table指的是标题为"Annotation States"的table:
我们使用了组合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" table 中可以看出,其他可能的状态选项是 "Rejected"、"Cancelled"、"Completed" 和 "None"(这是默认值)。
结果如下所示:
如您所见,评论面板中出现了一个绿色的复选标记。它在登录用户不是 Bruno 的计算机上显示 "Bruno Accepted"。你可以在这里自己检查一下:hello_accepted.pdf