2012-02-16 10 views
17

Stiamo usando iTextSharp con un'applicazione C# WinForms per analizzare un file PDF. Utilizzando iTextSharp, posso facilmente estrarre i dati di testo dal file PDF. Supponiamo che un file PDF contenga un'immagine circondata da due righe di testo. In questo caso, non sono riuscito a estrarre le informazioni sull'immagine.È possibile ottenere elementi strutturali da un file PDF utilizzando iTextSharp?

mia esigenza è:

  1. Diventa elementi strutturali del file PDF
  2. processo se ciascuno è di tipo testo, immagine, tabella o altro

Ad esempio, gli elementi strutturali sono simile al seguente:

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

Se posso ottenere informazioni in un formato come questo, posso facilmente capire le informazioni su testo, immagine, tabella, intestazione o piè di pagina.

Quindi, è possibile ottenere questo tipo di informazioni utilizzando iTextSharp? Se sì, per favore illuminami su questo. Altrimenti, potresti suggerire qualche altro strumento in grado di soddisfare questo requisito?

Grazie a tutti,

Saravanan

+0

possibile duplicato di http://stackoverflow.com/questions/5945244/extract-image-from-pdf-using-itextsharp – emd

+0

È specifico per C# 4.0? –

+0

@ Ryan Gates: Sì ... E 'per C# 4.0 – Saravanan

risposta

4

Ho usato per avere questo tipo di bisogno di qualche tempo fa. Ho usato questa funzione (da 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; 
} 

Come si può vedere nella dichiarazione foreach (PdfName name in xobj.Keys), penso che si può facilmente analizzare un intero PDF e trattare tutti i tipi di dati da esso. Ma non sono sicuro della parte "verticale" del tuo bisogno.

Spero potrebbe aiutare.

+0

Questo codice ignora completamente se l'immagine in questione è * usata * affatto su qualsiasi pagina visibile, figuriamoci dove nella sua struttura. Inoltre ignora le immagini in linea. Completamente. – mkl

+0

Ho usato questo codice per estrarre immagini "da" una pagina, ogni volta che il pdf è singolo o più pagine. Non ho detto che dovrebbe usare questo blocco di codice così com'è ... Potresti per favore aiutarmi a migliorare la mia risposta, allora? – cubitouch

+0

* Potresti per favore aiutarmi a migliorare la mia risposta, allora? * - beh, potresti iniziare sottolineando che la sua domanda implica una serie di malintesi. Ci sono ** no ** paragrafi o tabelle in PDF, solo alcuni pezzi di testo disegnati in luoghi. Presumo che questi fraintendimenti siano alcuni dei motivi per cui la domanda è rimasta senza risposta per quasi un anno prima della tua risposta. – mkl

Problemi correlati