2009-08-17 18 views
1

私のasp.netアプリケーションでは、PDFファイルからすべての画像を抽出したいと思います。pdfファイルからすべての画像を抽出

私はこのコードを試してみましたが、これは動作していない:

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

だから私は何を取得していないのです。アップロードボタンをクリックしてブラウジングした後、私のページで何も起こっていない、私はエラーを取得していません。

答えて

0

コードをデバッグする必要があります。必要に応じてブレークポイントを挿入し、実行されるコードの部分を確認します。

+2

私は通常このような奇妙な答えには同意しませんでした...しかし、ポスターが提示したコードは非常によく書かれておらず、読みにくいです。それは深く8レベルのネストを持ち、あまり名前のない変数がたくさんあります。私は正直なところ、ポスターがコードを読みやすくする時間がかからない場合、このコードを理解しようとするような気がしません。それをデバッガに叩きつけて町に行きなさい、私の友人、ここで助けてはいけない。 –

0

あなたの問題は、おそらくここにある:私はfalseに解決し、されている場合ので、残りのコードが実行されていないことを推測してい

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

関連する問題