2012-04-13 48 views
21

Có khả năng trích xuất văn bản thuần tuý từ tệp PDF với PdfSharp không? Tôi không muốn sử dụng iTextSharp vì giấy phép của nó.C# Trích xuất văn bản từ PDF bằng PdfSharp

Cảm ơn câu trả lời của bạn.

EDIT: Tôi biết rằng điều đó là có thể. Nhưng làm thế nào để tôi làm điều đó?

+0

Chỉ cần tự hỏi, tại sao downvotes? (Không có ý kiến ​​làm rõ để giúp tác giả cải thiện câu hỏi.) –

Trả lời

6

PDFSharp cung cấp tất cả các công cụ để trích xuất văn bản từ PDF. Sử dụng lớp ContentReader để truy cập các lệnh trong mỗi trang và trích xuất các chuỗi từ các toán tử TJ/Tj.

Tôi đã tải lên triển khai đơn giản tới github.

+1

Trên nhiều tệp PDF CString.Value chỉ trả lại một số thư rác (ví dụ: tạo PDF bằng OpenOffice.org và cố gắng nhập bằng cách sử dụng phương pháp này). –

11

Tôi đã thực hiện nó bằng cách nào đó tương tự như cách David đã làm. Đây là mã của tôi:

{ 
     // .... 
     var page = document.Pages[1]; 
     CObject content = ContentReader.ReadContent(page); 
     var extractedText = ExtractText(content); 
     // ... 
    } 

    private IEnumerable<string> ExtractText(CObject cObject) 
    { 
     var textList = new List<string>(); 
     if (cObject is COperator) 
     { 
      var cOperator = cObject as COperator; 
      if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || 
       cOperator.OpCode.Name == OpCodeName.TJ.ToString()) 
      { 
       foreach (var cOperand in cOperator.Operands) 
       { 
        textList.AddRange(ExtractText(cOperand)); 
       } 
      } 
     } 
     else if (cObject is CSequence) 
     { 
      var cSequence = cObject as CSequence; 
      foreach (var element in cSequence) 
      { 
       textList.AddRange(ExtractText(element)); 
      } 
     } 
     else if (cObject is CString) 
     { 
      var cString = cObject as CString; 
      textList.Add(cString.Value); 
     } 
     return textList; 
    } 
+0

Bạn không nên loại bỏ StringBuilder, các tệp PDF khá lớn và giải pháp đó sẽ gây ra mức tiêu thụ bộ nhớ không cần thiết lớn. –

19

Lấy câu trả lời của Sergio và thực hiện một số phương pháp mở rộng. Tôi cũng đã thay đổi sự tích lũy của chuỗi thành một trình lặp.

public static class PdfSharpExtensions 
{ 
    public static IEnumerable<string> ExtractText(this PdfPage page) 
    {  
     var content = ContentReader.ReadContent(page);  
     var text = content.ExtractText(); 
     return text; 
    } 

    public static IEnumerable<string> ExtractText(this CObject cObject) 
    { 
     if (cObject is COperator) 
     { 
      var cOperator = cObject as COperator; 
      if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || 
       cOperator.OpCode.Name == OpCodeName.TJ.ToString()) 
      { 
       foreach (var cOperand in cOperator.Operands) 
        foreach (var txt in ExtractText(cOperand)) 
         yield return txt; 
      } 
     } 
     else if (cObject is CSequence) 
     { 
      var cSequence = cObject as CSequence; 
      foreach (var element in cSequence) 
       foreach (var txt in ExtractText(element)) 
        yield return txt; 
     } 
     else if (cObject is CString) 
     { 
      var cString = cObject as CString; 
      yield return cString.Value; 
     } 
    } 
} 
+0

Tôi đang sử dụng thư viện PDFsharp nhưng nó nói rằng ContentReader Class nằm ngoài ngữ cảnh.Điều gì có thể là vấn đề? –

+0

Lớp ContentReader nằm ngoài ngữ cảnh. –

+2

Không thể cưỡng lại. IDK điều đó có nghĩa là gì hoặc cách sửa chữa nó. Tôi cố gắng tránh làm việc với PDF giống như bệnh dịch hạch bởi vì các công cụ để làm việc với họ là crap và giả vờ rằng một định dạng có thể đọc được con người là máy có thể đọc được là một kẻ ngu ngốc. –

Các vấn đề liên quan