Saltar al contenido

Extraer imagen de PDF usando itextsharp

Presta atención ya que en esta sección vas a encontrar el hallazgo que buscas.

Solución:

Resuelto…

Incluso obtuve la misma excepción de “El parámetro no es válido” y después de mucho trabajo con la ayuda del enlace proporcionado por der_chirurg (http://kuujinbo.info/iTextSharp/CCITTFaxDecodeExtract.aspx) lo resolví y lo siguiente es código:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using iTextSharp.text.pdf.parser;
using Dotnet = System.Drawing.Image;
using iTextSharp.text.pdf;

namespace PDF_Parsing

    partial class PDF_ImgExtraction
    
        string imgPath;
        private void ExtractImage(string pdfFile)
        
            PdfReader pdfReader = new PdfReader(files[fileIndex]);
            for (int pageNumber = 1; pageNumber <= pdfReader.NumberOfPages; pageNumber++)
            
                PdfReader pdf = new PdfReader(pdfFile);
                PdfDictionary pg = pdf.GetPageN(pageNumber);
                PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
                PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
                foreach (PdfName name in xobj.Keys)
                
                    PdfObject obj = xobj.Get(name);
                    if (obj.IsIndirect())
                    
                        PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
                        string width = tg.Get(PdfName.WIDTH).ToString();
                        string height = tg.Get(PdfName.HEIGHT).ToString();
                        ImageRenderInfo imgRI = ImageRenderInfo.CreateForXObject(new Matrix(float.Parse(width), float.Parse(height)), (PRIndirectReference)obj, tg);
                        RenderImage(imgRI);
                    
                
            
        
        private void RenderImage(ImageRenderInfo renderInfo)
        
            PdfImageObject image = renderInfo.GetImage();
            using (Dotnet dotnetImg = image.GetDrawingImage())
            
                if (dotnetImg != null)
                
                    using (MemoryStream ms = new MemoryStream())
                    
                        dotnetImg.Save(ms, ImageFormat.Tiff);
                        Bitmap d = new Bitmap(dotnetImg);
                        d.Save(imgPath);
                    
                
            
        
    

Debe verificar el /Filtro de la transmisión para ver qué formato de imagen usa una imagen determinada. Puede ser un formato de imagen estándar:

  • DCTDecode (jpeg)
  • Decodificación JPX (jpeg 2000)
  • JBIG2Decode (jbig es un formato solo en blanco y negro)
  • CCITTFaxDecode (formato de fax, PDF admite el grupo 3 y 4)

Aparte de eso, deberá obtener los bytes sin procesar (tal como está) y crear una imagen utilizando el ancho, la altura, los bits por componente, la cantidad de componentes de color del flujo de imágenes (podría ser CMYK, indexado, RGB o Algo Extraño), y algunos otros, como se define en la sección 8.9 de la ESPECIFICACIÓN ISO PDF (disponible de forma gratuita).

Entonces, en algunos casos, su código funcionará, pero en otros, fallará con la excepción que mencionó.

PD: cuando tenga una excepción, POR FAVOR incluya el seguimiento de la pila cada vez. Bastante por favor con azúcar en la parte superior?

En la versión más nueva de iTextSharp, el primer parámetro de ImageRenderInfo.CreateForXObject no es Matrix mas pero GraphicsState. El enfoque de @der_chirurg debería funcionar. Me probé con la información del siguiente enlace y funcionó muy bien:

http://www.thevalvepage.com/swmonkey/2014/11/26/extract-images-from-pdf-files-using-itextsharp/

Si te sientes suscitado, tienes la opción de dejar una división acerca de qué le añadirías a este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *