2014-10-30 110 views
3

按如下因素後: iTextSharp PDF Reading highlighed text (highlight annotations) using C#如何使用iTextSharp從PDF中提取高亮文本?

驗證碼:

for (int i = pageFrom; i <= pageTo; i++) { 
    PdfDictionary page = reader.GetPageN(i); 
    PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS); 
    if (annots!=null) 
     foreach (PdfObject annot in annots.ArrayList) { 
      PdfDictionary annotation = (PdfDictionary)PdfReader.GetPdfObject(annot); 
      PdfString contents = annotation.GetAsString(PdfName.CONTENTS); 
      // now use the String value of contents 
     } 
    } 
} 

正在提取PDF註釋。但是,爲什麼同樣的下面的代碼是不是亮點工作(特別是PdfName.HIGHLIGHT不工作):

for (int i = pageFrom; i <= pageTo; i++) { 
    PdfDictionary page = reader.GetPageN(i); 
    PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.HIGHLIGHT); 
    if (annots!=null) 
     foreach (PdfObject annot in annots.ArrayList) { 
      PdfDictionary annotation = (PdfDictionary)PdfReader.GetPdfObject(annot); 
      PdfString contents = annotation.GetAsString(PdfName.CONTENTS); 
      // now use the String value of contents 
     } 
    } 
} 

回答

3

請參加ISO-32000-1看看錶30(又名PDF參考)。它的標題是「頁面對象中的條目」。在這些條目中,您可以找到一個名爲Annots的密鑰。它的值是:

(可選),應包含 與網頁相關聯的所有註解間接引用註釋字典的數組(見 12.5,「集註」)。

你不會找到這樣的一個關鍵Highlight的條目,因此它僅僅是正常的,返回的數組爲null,當你有這樣一行:

PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.HIGHLIGHT); 

你需要得到註解你已經做的方式:

PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS); 

現在你需要遍歷這個數組,尋找註解與Subtype等於Highlight。 ISO-32000-1標題爲「註釋類型」的表169列出了這種類型的註釋。

換句話說,假設頁面字典包含鍵爲Highlight的條目是錯誤的,如果您閱讀了整個規範,您還會發現另一個錯誤的假設。您錯誤地認爲突出顯示的文本存儲在註釋的Contents條目中。這表明對註釋與頁面內容的性質缺乏瞭解。

您正在查找的文本存儲在頁面的內容流中。頁面的內容流獨立於頁面的註釋。因此,要獲取突出顯示的文本,需要獲取存儲在Highlight註釋中的座標(存儲在QuadPoints數組中),並且需要使用這些座標來解析頁面內容中存在的文本。

2

這裏是提取使用iTextSharp的

public void GetRectAnno() 
    { 

     string appRootDir = new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName; 

     string filePath = appRootDir + "/PDFs/" + "anot.pdf"; 

     int pageFrom = 0; 
     int pageTo = 0; 

     try 
     { 
      using (PdfReader reader = new PdfReader(filePath)) 
      { 
       pageTo = reader.NumberOfPages; 

       for (int i = 1; i <= reader.NumberOfPages; i++) 
       { 


        PdfDictionary page = reader.GetPageN(i); 
        PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS); 
        if (annots != null) 
         foreach (PdfObject annot in annots.ArrayList) 
         { 

          //Get Annotation from PDF File 
          PdfDictionary annotationDic = (PdfDictionary)PdfReader.GetPdfObject(annot); 
          PdfName subType = (PdfName)annotationDic.Get(PdfName.SUBTYPE); 
          //check only subtype is highlight 
          if (subType.Equals(PdfName.HIGHLIGHT)) 
          { 
           // Get Quadpoints and Rectangle of highlighted text 
           Console.Write("HighLight at Rectangle {0} with QuadPoints {1}\n", annotationDic.GetAsArray(PdfName.RECT), annotationDic.GetAsArray(PdfName.QUADPOINTS)); 

           //Extract Text using rectangle strategy  
           PdfArray coordinates = annotationDic.GetAsArray(PdfName.RECT); 

           Rectangle rect = new Rectangle(float.Parse(coordinates.ArrayList[0].ToString(), CultureInfo.InvariantCulture.NumberFormat), float.Parse(coordinates.ArrayList[1].ToString(), CultureInfo.InvariantCulture.NumberFormat), 
           float.Parse(coordinates.ArrayList[2].ToString(), CultureInfo.InvariantCulture.NumberFormat),float.Parse(coordinates.ArrayList[3].ToString(), CultureInfo.InvariantCulture.NumberFormat)); 



           RenderFilter[] filter = { new RegionTextRenderFilter(rect) }; 
           ITextExtractionStrategy strategy; 
           StringBuilder sb = new StringBuilder(); 


           strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter); 
           sb.AppendLine(PdfTextExtractor.GetTextFromPage(reader, i, strategy)); 

           //Show extract text on Console 
           Console.WriteLine(sb.ToString()); 
           //Console.WriteLine("Page No" + i); 

          } 



         } 



       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
+1

高亮文本在多亮點在哪中線您將提取過多的開始或結束時的完整的例子。考慮檢查** QuadPoints **而不是** Rect **。例如。 [這個問題](http://stackoverflow.com/q/32608083/1729265)討論了這樣的情況,儘管爲一個不同的庫,並且[這個答案](http://stackoverflow.com/a/33278436/1729265 )討論細節.. – mkl 2016-01-07 16:02:19

相關問題