2009-08-17 8 views
1

Dans mon application asp.net, je veux extraire toutes les images d'un fichier PDF.Extraire toutes les images du fichier pdf

J'ai essayé ce code, mais cela ne fonctionne pas:

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 
using System.IO; 
using System.Drawing.Imaging; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 

namespace WebPages2.Site 
{ 
    public partial class PDFImageReader : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 
     protected void ctrlUploadButton_Click(object sender, EventArgs e) 
     { 
      string path = this.ctrlFileUpload.FileName; 
      string outputPath = this.Server.MapPath("~/Image"); 

      ExtractImagesFromPDF(path, outputPath); 
     } 
     #region ExtractImagesFromPDF 
     public static void ExtractImagesFromPDF(string sourcePdf, string outputPath) 
     { 
      // NOTE: This will only get the first image it finds per page. 
      PdfReader pdf = new PdfReader(sourcePdf); 

      RandomAccessFileOrArray raf = new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf); 

      try 
      { 
       for (int pageNumber = 1; pageNumber <= pdf.NumberOfPages; pageNumber++) 
       { 
        PdfDictionary pg = pdf.GetPageN(pageNumber); 
        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)); 
           if (PdfName.IMAGE.Equals(type)) 
           { 

            int XrefIndex = Convert.ToInt32(((PRIndirectReference)obj).Number.ToString(System.Globalization.CultureInfo.InvariantCulture)); 
            PdfObject pdfObj = pdf.GetPdfObject(XrefIndex); 
            PdfStream pdfStrem = (PdfStream)pdfObj; 
            byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)pdfStrem); 
            if ((bytes != null)) 
            { 
             using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(bytes)) 
             { 
              memStream.Position = 0; 
              System.Drawing.Image img = System.Drawing.Image.FromStream(memStream); 
              // must save the file while stream is open. 

              if (!Directory.Exists(outputPath)) 
               Directory.CreateDirectory(outputPath); 

              string path = Path.Combine(outputPath, String.Format(@"{0}.jpg", pageNumber)); 
              System.Drawing.Imaging.EncoderParameters parms = new System.Drawing.Imaging.EncoderParameters(1); 
              parms.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, 0); 
              // GetImageEncoder is found below this method 
              System.Drawing.Imaging.ImageCodecInfo jpegEncoder = GetImageEncoder("JPEG"); 
              img.Save(path, jpegEncoder, parms); 
              //WebPages2.Classes.MessageBox.Show(path); 

              break; 

             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 

      catch 
      { 
       throw; 
      } 
      finally 
      { 
       pdf.Close(); 
      } 


     } 
     #endregion 

     #region GetImageEncoder 
     public static System.Drawing.Imaging.ImageCodecInfo GetImageEncoder(string imageType) 
     { 
      imageType = imageType.ToUpperInvariant(); 



      foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders()) 
      { 
       if (info.FormatDescription == imageType) 
       { 
        return info; 
       } 
      } 

      return null; 
     } 
     #endregion 
    } 
} 

Je reçois rien; après la navigation lorsque je clique sur le bouton de téléchargement rien ne se passe dans ma page, je ne reçois aucune erreur.

Répondre

0

Vous devez déboguer votre code. Insérez des points d'arrêt le cas échéant et vérifiez quelles parties du code sont exécutées.

+2

Je ne suis normalement pas d'accord avec une réponse aussi stridente ... mais le code que l'affiche est très mal écrit et difficile à lire. Il niche jusqu'à 8 niveaux de profondeur et possède des tonnes de variables mal nommées. Honnêtement, je n'ai pas envie d'essayer de comprendre ce code si l'affiche ne peut pas prendre le temps de rendre le code lisible. Slap dans un débogueur, et aller en ville, mon ami, pas d'aide ici. –

0

Votre problème est probablement ici:

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

Je suppose que le cas est résolu à faux, et donc le reste du code ne fonctionne pas.

Questions connexes