2012-02-16 33 views
17

Estamos utilizando iTextSharp con una aplicación C# WinForms para analizar un archivo PDF. Usando iTextSharp, puedo extraer fácilmente los datos de texto del archivo PDF. Supongamos que un archivo PDF contiene una imagen rodeada por dos líneas de texto. En este caso, no pude extraer la información sobre la imagen.¿Es posible obtener elementos estructurales de un archivo PDF usando iTextSharp?

Mi requisito es:

  1. Obtener elementos estructurales del archivo PDF
  2. Proceso de si cada uno es de tipo texto, imagen, mesa u otra

Por ejemplo, los elementos estructurales son similar a la siguiente:

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

Si puedo obtener información en un formato como este, puedo entender fácilmente la información de texto, imagen, tabla, encabezado o pie de página.

Entonces, ¿es posible obtener este tipo de información usando iTextSharp? Si es así, por favor ilumíname sobre esto. De lo contrario, ¿podría sugerir algunas otras herramientas capaces de cumplir este requisito?

Gracias a todos,

Saravanan

+0

posible duplicado de http://stackoverflow.com/questions/5945244/extract-image-from-pdf-using-itextsharp – emd

+0

¿Es esto específico para C# 4.0? –

+0

@ Ryan Gates: Sí ... Es para C# 4.0 – Saravanan

Respuesta

4

que solía tener este tipo de necesitar hace un tiempo. He utilizado esta función (de 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; 
} 

Como se puede ver en la declaración foreach (PdfName name in xobj.Keys), creo que se puede analizar fácilmente todo el pdf y el tratamiento de todo tipo de datos de la misma. Pero no estoy seguro de la parte de "verticalidad" de su necesidad.

Espero que te pueda ayudar.

+0

Este código ignora por completo si la imagen en cuestión * se usa * en absoluto en cualquier página visible, y mucho menos en su estructura. Además, ignora las imágenes en línea. Completamente. – mkl

+0

Utilicé este código para extraer imágenes "de" una página, siempre que el pdf sea de una o varias páginas. No dije que debería usar este bloque de código como está ... ¿Podrías por favor ayudarme a mejorar mi respuesta? – cubitouch

+0

* ¿Podrías por favor ayudarme a mejorar mi respuesta? * - Bien, podrías comenzar señalando a la op que su pregunta implica una cantidad de conceptos erróneos. Hay ** párrafos ** o tablas en PDF, simplemente algunos fragmentos de texto dibujados en lugares. Supongo que estos conceptos erróneos son algunas de las razones por las cuales la pregunta había quedado sin respuesta durante casi un año antes de su respuesta. – mkl

Cuestiones relacionadas