【问题标题】:"Parameter is not valid" error when extracting images using iTextSharp from a PDF containing JPXDecode filter使用 iTextSharp 从包含 JPXDecode 过滤器的 PDF 中提取图像时出现“参数无效”错误
【发布时间】:2015-07-10 00:58:42
【问题描述】:

我正在尝试使用以下代码从 PDF 中提取图像。它适用于 DCTDecode 等某些过滤器,但不适用于 JPXDEcode。“参数无效”错误发生在点 image.GetDrawingImage() 被调用。

 using System.Drawing.Imaging;
    using iTextSharp.text.pdf;
    using iTextSharp.text.pdf.parser;
    ...
    PdfReader pdf = new PdfReader(currfilename);
     PdfReaderContentParser parser = new PdfReaderContentParser(pdf);
     ImageRender listener = new ImageRender();
     for (int i = 1; i <= pdf.NumberOfPages; i++)
     {
          try
          {
              parser.ProcessContent(i, listener);//calls RenderImage() at this point

           }
           catch (Exception e)
           {
                Console.WriteLine(e);
           }

      }


    public void RenderImage(ImageRenderInfo renderInfo)
            {
                PdfImageObject image = renderInfo.GetImage();
                PdfName filter = image.Get(PdfName.FILTER) as PdfName;


                if (renderInfo.GetRef() != null && image != null)
                {
                    using (System.Drawing.Image dotnetImg = image.GetDrawingImage())//exception occurs at this point
                    {
                        if (dotnetImg != null)
                        {
                            ImageNames.Add(string.Format("{0}.tiff", renderInfo.GetRef().Number));
                            using (MemoryStream ms = new MemoryStream())
                            {
                                dotnetImg.Save(ms, ImageFormat.Tiff);
                                Images.Add(ms.ToArray());
                            }
                        }
                    }
                }



            }

我尝试了这些链接以寻求解决方案

Extract images using iTextSharp

Extract Image from a particular page in PDF

并且能够使用 PdfReader.GetStreamBytesRaw() 函数提取原始图像字节,但“参数无效”异常总是发生在调用 System.Drawing.Image.FromStream(memory stream) 的位置。

我也检查了这个链接"Parameter is not valid" exception from System.Drawing.Image.FromStream() method,但找不到任何有用的东西。

请帮忙

【问题讨论】:

    标签: image pdf filter itextsharp


    【解决方案1】:

    JPXDecode filter corresponds to JPEG 2000 compression,.net 框架不支持。 SO中的另一个问题可能会有所帮助:JPEG 2000 support in C#.NET

    【讨论】:

    • 谢谢你..我会通过这些
    【解决方案2】:

    使用 FreeImage.dll 解决了这个问题。代码如下

    using FreeImageAPI;
    using System.Drawing.Imaging;
    using iTextSharp.text.pdf;
    using iTextSharp.text.pdf.parser;
    ...
            imagecount = 0;
            PdfReader pdf = new PdfReader(currfilename);
            PdfReaderContentParser parser = new PdfReaderContentParser(pdf);
            ImageRender listener = new ImageRender();
            for (int i = 1; i <= pdf.NumberOfPages; i++)
            {
             try
                {
                      parser.ProcessContent(i, listener);//calls RenderImage() at this point
                }
             catch (Exception e)
             {
                 Console.WriteLine(e);
             }
    
           }
           if (listener.Images.Count > 0)
           {
               for (int j = 0; (j < listener.Images.Count); ++j)
               {
                  string imgpath = Environment.CurrentDirectory.ToString() +  "\\Image" + imagecount + ".bmp";
    
                  // create a memory stream
                  MemoryStream imageStream = new MemoryStream(listener.Images[j]);
                  // create a FIBITMAP from that stream
                  FIBITMAP dib = FreeImage.LoadFromStream(imageStream);
    
                  if (dib.IsNull) continue;
                 //turn it into a normal Bitmap 
                 Bitmap bitmap = FreeImage.GetBitmap(dib);
                 bitmap.Save(imgpath);
                 //unload the FIBITMAP 
                 FreeImage.UnloadEx(ref dib);
                 bitmap.Dispose();
    
                 System.Drawing.Image img = System.Drawing.Image.FromFile(imgpath);
    
    
    
               }
    
    
    
    
    
      public void RenderImage(ImageRenderInfo renderInfo)
     {
        PdfImageObject image = renderInfo.GetImage();    
        if (renderInfo.GetRef() != null && image != null)
        {
    
          byte[] tempImage = image.GetImageAsBytes();                                  
          ImageNames.Add(string.Format("0}.bmp",renderInfo.GetRef().Number));
          Images.Add(tempImage);
    
         }             
    
    
    }
    

    我按照here 的说明将 FreeImage .Net 添加到解决方案中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2011-02-08
      • 2016-02-14
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多