【问题标题】:How do I mark/unmark, write as Accepted/Rejected/Cancelled a text annotation using iTextSharp C#如何使用 iTextSharp C# 标记/取消标记、写为接受/拒绝/取消文本注释
【发布时间】:2016-10-05 18:02:11
【问题描述】:

我正在 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 上写的所有 cmets 时,我看到了我的评论,并且在我的评论“我写我的文本”附近,我看到一个我可以选中或取消选中的小方块。 这是我创建 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);

有人知道怎么做吗?

非常感谢!

祝你有美好的一天! :)

【问题讨论】:

  • 您正在创建文本注释。您不能选中或取消选中文本注释。请向我们展示您是如何创建复选框的。
  • 如果您在 Adob​​e Acrobat Reader 上查看,您会看到添加注释后,您可以选择选中或取消选中它。我无法添加图片,网站不允许我添加(因为我是新手)。
  • 您的问题不准确。您正在创建文本注释(又名便笺)。您可以将表示更改为复选标记,如 here 所示,但这不是您要问的。您要求选中/取消选中复选框。复选框是由小部件注释表示的表单字段,不是文本注释。更准确!
  • 在你展示给我的图片上,在“评论列表”栏中,我看到了你的名字“Bruno”,在右边我看到了一个小方块,这就是我所说的复选框关于,我想和 itextSharp 核对一下
  • 你知道那个复选框的含义吗?请解释!

标签: c# pdf properties itextsharp pdf-annotations


【解决方案1】:

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

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

标记文本注释不是选中复选框的问题。通过添加隐藏的“回复”(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

【讨论】:

  • 感谢您的回答!为什么要使用这一行:replySticky.Put(PdfName.IRT, annots.GetAsIndirectObject(0));因为当我写它时,我不再看到我的评论答案“由布鲁诺标记”。当我不写它时,我的答案就在这里,但问题仍然存在:我的答案没有被标记。
  • 不要照抄我的例子。如果您删除了IRT 键,您将无法理解我的回答。 IRT 代表 In Reply To。 该条目的值是对需要标记的注解的引用。在我的简单示例中,这很简单:只有一个注释,所以我可以取第一个 annots.getAsIndirectObject(0)。在您的情况下,您必须将 0 更改为您要标记的注释的索引。首先尝试 hello_sticky_note.pdf 上的示例。检查发生的情况并调整简单示例以满足您的需求。
  • 我用您的 pdf 示例 hello_sticky_note.pdf 复制了您的代码,但它不起作用。 “Marked set by Bruno”的答案没有出现,标记也没有出现
  • 不应出现“由布鲁诺标记设置”的答案:它是HIDDEN!标记应该出现并出现(正确完成时)。当我在 Java 中运行代码时,它按预期工作。我不知道你做错了什么,但它对我有用。这是我的证明:gitlab.itextsupport.com/itext/sandbox/raw/master/cmpfiles/…
  • 我保存了校样并使用 Adob​​e Reader 打开它,但我没有看到任何标记
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2017-02-20
  • 2012-07-08
  • 2017-03-06
  • 2014-01-11
相关资源
最近更新 更多