如何使用iTextSharp添加对注释的回复

时间:2015-02-11 09:25:40

标签: c# pdf itextsharp

我正在尝试使用iTextSharp在pdf中添加便利贴回复。我能够在pdf中创建一个新的注释。但我无法将其链接为已存在注释的子项。我将父级中的大多数属性复制到其子级。我通过手动添加Adobe Reader的回复,通过分析回复的属性来复制它。我缺少的是财产/ IRT。它需要对父弹出窗口的引用。喜欢/ IRT 16 0 R. 以下是我正在尝试的代码。



private void annotateReplyPdf()
        {
            string outputFile = @"D:\temp\temp.pdf";
             // Creating iTextSharp.text.pdf.PdfReader object to read the Existing PDF Document
            using (PdfReader reader = new PdfReader(FILE_NAME))
            {
                using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    // Creating iTextSharp.text.pdf.PdfStamper object to write Data from iTextSharp.text.pdf.PdfReader object to FileStream object
                    using (PdfStamper stamper = new PdfStamper(reader, fs))
                    {
                        //get page 1                                                
                        PdfDictionary pageDic = reader.GetPageN(1);

                        //get annotations in page 1
                        PdfArray pageAnnotsArray = pageDic.GetAsArray(PdfName.ANNOTS);
                        if (pageAnnotsArray != null)
                        {
                            PdfDictionary curAnnotDic = pageAnnotsArray.GetAsDict(0);
                            PdfArray rect = curAnnotDic.GetAsArray(PdfName.RECT);
                            Rectangle rectangle = new Rectangle(float.Parse(rect[0].ToString()), float.Parse(rect[1].ToString()), float.Parse(rect[2].ToString()), float.Parse(rect[3].ToString()));
                            PdfAnnotation newAnnot = new PdfAnnotation(stamper.Writer, rectangle);
                            
                            newAnnot.Title = "john.conor";
                            var dtNow = DateTime.Now;
                            newAnnot.Put(PdfName.C, curAnnotDic.Get(PdfName.C));
                            newAnnot.Put(PdfName.CONTENTS, new PdfString("Reply using prog"));
                            newAnnot.Put(PdfName.CREATIONDATE, new PdfDate(dtNow));

                           // newAnnot.Put(PdfName.IRT, curAnnotDic.); stuck here


                            newAnnot.Put(PdfName.M, new PdfDate(dtNow));
                            newAnnot.Put(PdfName.NAME, curAnnotDic.Get(PdfName.NAME));
                            newAnnot.Put(PdfName.RC, curAnnotDic.Get(PdfName.RC));
                            newAnnot.Put(PdfName.SUBTYPE, PdfName.TEXT);
                            newAnnot.Put(PdfName.SUBJECT, curAnnotDic.Get(PdfName.SUBJECT));

                            stamper.AddAnnotation(newAnnot, 1);
                        }
                    }
                }
            }
        }



 我使用的方法可能不准确或有效,因为大多数代码是通过反复试验和检查其他类似示例(也检查pdf规范)找到的。 有人可以填写那个有魔力的代码。 请注意:SO question并未提供答案代码。

1 个答案:

答案 0 :(得分:0)

请查看AddInReplyTo示例。

我们有一个名为hello_sticky_note.pdf的文件,如下所示:

PDF with a sticky note

我将跳过该方法来检测便签的注释(在您的问题中,您已经拥有此代码)。在我的示例中,我知道此注释是/Annots数组中的第一个条目(带有索引0的注释)。

这就是我要在"中添加"的回复。注释:

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);
    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, "Reply", "Hello PDF", true, "Comment");
    replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0));
    stamper.addAnnotation(replySticky, 1);
    stamper.close();
}

就像你一样,我得到了原始注释(在我的代码中,它被命名为sticky),我得到了该注释的位置(stickyRect)。我创建一个stickyRectangle对象的方式与您的方式略有不同(我的方式更好,但这并不重要)我使用stickyRectangle创建一个新的{{1}名为PdfAnnotation

那是你已经拥有的。现在我添加缺少的部分:

replySticky

在您的代码中,您添加了注释字典,但实际需要的是对该字典的引用。

生成的PDF看起来像hello_in_reply_to.pdf

PDF with a sticky note and a reply to this note