2009-08-17 9 views
1

In meiner asp.net-Anwendung möchte ich alle Bilder aus einer PDF-Datei extrahieren.Alle Bilder aus der PDF-Datei extrahieren

habe ich versucht, diesen Code, aber das funktioniert nicht:

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 
    } 
} 

Ich bekomme nichts So; nach dem Browsen, wenn ich auf den Upload-Button klicke, passiert nichts auf meiner Seite, ich bekomme keinen Fehler.

Antwort

0

Sie müssen Ihren Code debuggen. Fügen Sie gegebenenfalls Haltepunkte ein und prüfen Sie, welche Teile des Codes ausgeführt werden.

+2

Normalerweise würde ich einer so schrillen Antwort nicht zustimmen ... aber der Code, den das Poster präsentierte, ist sehr schlecht geschrieben und schwer zu lesen. Es nistet bis zu 8 Ebenen tief und hat Tonnen von schlecht benannten Variablen. Ehrlich gesagt habe ich keine Lust, diesen Code zu verstehen, wenn das Poster sich nicht die Zeit nehmen kann, den Code lesbar zu machen. Schlag es in einen Debugger und geh in die Stadt, mein Freund, keine Hilfe hier. –

0

Ihr Problem ist wahrscheinlich hier:

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

Ich vermute, dass das, wenn auf unwahr Lösung und damit der Rest des Codes wird nicht ausgeführt.

Verwandte Themen