1

我正在 Visual Studio 上使用 iTextSharp。我创建了一个这样的 Pdfannotation:

PdfAnnotation annotation = PdfAnnotation.CreateText(stamper.Writer, rect, "Author", "I write my text", true, "New Paragraph");
stamper.AddAnnotation(annotation, 1);

所以我的注释内容是一个文本“我写我的文本”。当我在 Adob​​e Acrobat Reader 上打开我的 pdf 时,当我单击“评论”按钮查看我在我的 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);

有谁知道该怎么做?

十分感谢!

祝你有美好的一天!:)

4

1 回答 1

0

由于文本(或便笺)注释上下文中的术语“选中/取消选中”,这个问题有些混乱。正确的术语应该是:如何标记/取消标记文本注释?

选中/取消选中立即让我们想到复选框,但以下屏幕截图显示了我们谈论标记文本注释时的含义:

在此处输入图像描述

标记文本注释不是选中复选框的问题。通过添加隐藏的“回复”(IRT)注释来标记文本注释。请参阅如何添加“回复”注释?有关“回复”注释的更多信息,请访问官方网站。

我已经使用AddMarked作为结果调整了AddInReplyTo示例:

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到注释的标志来隐藏注释。我们还设置了/StatetoMarked/StateModelto 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; 状态 = 接受。从“注释状态”表中可以看出,状态的其他可能选项是“拒绝”、“取消”、“完成”和“无”(这是默认值)。

结果如下所示:

在此处输入图像描述

如您所见,评论面板中出现绿色复选标记。它在登录用户不是布鲁诺的计算机上显示“布鲁诺接受”。你可以在这里自己检查:hello_accepted.pdf

于 2016-06-06T11:45:43.323 回答