如何使用iTextSharp从便签中获取文本?

时间:2013-07-01 11:22:14

标签: c# itextsharp

我正在尝试使用iTextSharp从pdf中提取所有文本。目前我只能获取页面上的实际文本,而不是Adobe调用的用户注释或“便笺”中包含的文本。有办法做到这一点吗?到目前为止,这是我的代码,但我只是得到空字符串:

    PdfReader pdfRead = new PdfReader(pdfFilePath);
    AcroFields form = pdfRead.AcroFields;            

    string txt = "";
    for (int page = 1; page <= pdfRead.NumberOfPages; ++page)
    {
           PdfDictionary pagedic = pdfRead.GetPageN(page);
           PdfArray annotarray = (PdfArray)PdfReader.GetPdfObject(pagedic.Get(PdfName.ANNOTS));

           if (annotarray == null || annotarray.Size == 0)
                 continue;

           foreach (PdfObject A in annotarray.ArrayList)
           {
                 PdfDictionary AnnotationDictionary = (PdfDictionary)PdfReader.GetPdfObject(A);

                 txt += AnnotationDictionary.GetAsString(PdfName.NOTE);
                 txt += "\n";
           }
     } 

2 个答案:

答案 0 :(得分:3)

我不了解C#,但您可以找到对应部分here(此示例中使用的文件为pages.pdf)。此示例的输出为:

Annotation 1
/Contents: This is a post-it annotation
/Subtype: /Text
/Rect: [36, 768, 56, 788]
/T: Example
Annotation 2
/C: [0, 0, 1]
/Border: [0, 0, 0]
/A: Dictionary
/Subtype: /Link
/Rect: [66.67, 785.52, 98, 796.62]

第一个注释是便签注释(用ISO-32000-1的话来说,一个文本注释)和你正在寻找的键不是PdfName.NOTE,但标题为PdfName.T,内容为PdfName.CONTENTS

答案 1 :(得分:2)

if (AnnotationDictionary.Get(PdfName.SUBTYPE).Equals(PdfName.TEXT))
{
     string Title = AnnotationDictionary.GetAsString(PdfName.T).ToString();
     string Content = AnnotationDictionary.GetAsString(PdfName.CONTENTS).ToString();
}