2009-11-25 3 views
0

Я хотел знать, как захватить элемент изображения в файле PDF с помощью C#. Я знаю, как добавить элементы в файл PDF. Мне просто нужно знать, как получить доступ к элементам изображения.Как захватить элементы изображения в формате PDF с помощью C#

Я также использую iTextSharp.

ответ

2

Я считаю, что вы можете сделать это с помощью itextsharp.

У меня был этот код, хранящийся на моей машине, но он никогда не использовал его. Я получил его с форума, и он не тестировался, но я уверен, что вы могли бы заставить его работать.

using iTextSharp.text; 
using iTextSharp.text.pdf; 

#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); 
              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

Имейте в виду, изображение не может существовать как изображение, а как набор клякс (т.е. необработанных данных, данные COLORSPACE, профиль ICC или цветовом), который вам нужно будет собрать. Необработанное изображение также можно манипулировать на дисплее (т.е. масштабироваться, поворачиваться, перевернуто, замаскировано, обрезано).

Смежные вопросы