2012-02-16 32 views
17

Chúng tôi đang sử dụng iTextSharp với ứng dụng C# WinForms để phân tích cú pháp tệp PDF. Sử dụng iTextSharp, tôi có thể dễ dàng trích xuất dữ liệu văn bản từ tập tin PDF. Giả sử tệp PDF chứa hình ảnh được bao quanh bởi hai dòng văn bản. Trong trường hợp này, tôi không thể trích xuất thông tin về hình ảnh.Có thể lấy các yếu tố cấu trúc từ một tệp PDF bằng iTextSharp không?

yêu cầu của tôi là:

  1. Nhận yếu tố cấu trúc của tập tin PDF
  2. Process xem mỗi là loại văn bản, hình ảnh, bảng hoặc khác

Ví dụ, các yếu tố cấu trúc là tương tự như sau:

text :paragraph1 
text :paragraph2 
Image:Image 
text :paragraph3 
Table:table info 
text :Paragraph4 

Nếu tôi có thể lấy thông tin trong một định dạng như thế này, tôi có thể dễ dàng hiểu được thông tin văn bản, hình ảnh, bảng, đầu trang hoặc chân trang.

Vì vậy, có thể lấy loại thông tin này bằng iTextSharp không? Nếu có, xin vui lòng khai sáng cho tôi về điều này. Nếu không, bạn có thể đề nghị một số công cụ khác có khả năng đáp ứng yêu cầu này không?

Nhờ tất cả,

Saravanan

+0

có thể trùng lặp của http://stackoverflow.com/questions/5945244/extract-image-from-pdf-using-itextsharp – emd

+0

Điều này có cụ thể đối với C# 4.0 không? –

+0

@ Ryan Gates: Có ... Đó là cho C# 4.0 – Saravanan

Trả lời

4

Tôi từng có loại cần một thời gian trước đây. Tôi đã sử dụng chức năng này (từ Extract images using iTextSharp):

private static PdfObject FindImageInPDFDictionary(PdfDictionary pg) 
{ 
    PdfDictionary res = 
     (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES)); 


    PdfDictionary xobj = 
     (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT)); 
    if (xobj != null) 
    { 
     foreach (PdfName name in xobj.Keys) 
     { 

      PdfObject obj = xobj.Get(name); 
      if (obj.IsIndirect()) 
      { 
       PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj); 

       PdfName type = 
        (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE)); 

       //image at the root of the pdf 
       if (PdfName.IMAGE.Equals(type)) 
       { 
        return obj; 
       }// image inside a form 
       else if (PdfName.FORM.Equals(type)) 
       { 
        return FindImageInPDFDictionary(tg); 
       } //image inside a group 
       else if (PdfName.GROUP.Equals(type)) 
       { 
        return FindImageInPDFDictionary(tg); 
       } 

      } 
     } 
    } 

    return null; 
} 

Như bạn có thể nhìn thấy trong báo cáo kết quả foreach (PdfName name in xobj.Keys), tôi nghĩ bạn có thể dễ dàng phân tích toàn bộ một PDF và đối xử với tất cả các loại dữ liệu từ nó. Nhưng tôi không chắc chắn về phần "theo chiều dọc" của nhu cầu của bạn.

Hy vọng nó có thể giúp bạn.

+0

Mã này hoàn toàn bỏ qua xem hình ảnh được đề cập có được sử dụng * ở tất cả trên bất kỳ trang hiển thị nào hay không, hãy để một mình ở đâu trong cấu trúc của nó. Hơn nữa nó bỏ qua hình ảnh nội tuyến. Hoàn toàn. – mkl

+0

Tôi đã sử dụng mã này để trích xuất hình ảnh "từ" một trang, bất cứ khi nào pdf là một hoặc nhiều trang. Tôi đã không nói rằng anh ta nên sử dụng khối mã này như là ... Bạn có thể vui lòng giúp tôi cải thiện câu trả lời của tôi sau đó? – cubitouch

+0

* Bạn có thể vui lòng giúp tôi cải thiện câu trả lời của tôi không? * - tốt, bạn có thể bắt đầu bằng cách chỉ ra cho op rằng câu hỏi của ông ngụ ý một số quan niệm sai lầm. Có ** không có ** đoạn hoặc bảng trong tệp PDF, chỉ đơn thuần là một số đoạn văn bản được vẽ ở các vị trí. Tôi cho rằng những quan niệm sai lầm này là một số lý do tại sao câu hỏi vẫn chưa được trả lời trong gần một năm trước câu trả lời của bạn. – mkl

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