2011-11-24 122 views
3

我试图从pdf中提取图像。图像是过滤器“FlateDecode”。我得到的图像,但它只是一个黑色的道路。我是一个新手,请帮助我。该代码是:使用PdfSharp从pdf中提取“FLATEDECODE”类型的图像

int width = xObject.Elements.GetInteger(PdfImage.Keys.Width); 
int height = xObject.Elements.GetInteger(PdfImage.Keys.Height); 
int bitsPerComponent = xObject.Elements.GetInteger (PdfSharp.Pdf.Advanced.PdfImage.Keys.BitsPerComponent); 
System.Drawing.Imaging.PixelFormat pixelFormat = new System.Drawing.Imaging.PixelFormat(); 
switch (bitsPerComponent) 
{ 
      case 1: 
       pixelFormat = System.Drawing.Imaging.PixelFormat.Format1bppIndexed; 
       break; 
      case 8: 
       pixelFormat = System.Drawing.Imaging.PixelFormat.Format8bppIndexed; 
       break; 
      case 24: 
       pixelFormat = System.Drawing.Imaging.PixelFormat.Format24bppRgb; 
       break; 
      default: 
       throw new Exception("Unknown pixel format " + bitsPerComponent); 
} 
Bitmap bitmap = new Bitmap(width, height, pixelFormat); 
byte[] raw = xObject.Stream.Value; 
BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height),  ImageLockMode.WriteOnly, pixelFormat); 
Marshal.Copy(raw, 0, bitmapData.Scan0, raw.Length); 
bitmap.UnlockBits(bitmapData); 
using (MemoryStream imageStream = new MemoryStream()) 
{ 
      bitmap.Save(imageStream, ImageFormat.png); 
      System.Drawing.Image img = System.Drawing.Image.FromStream(imageStream); 

      img.Save("D:\\trial.png", System.Drawing.Imaging.ImageFormat.png); 
} 
+0

请注意,索引图像由位和调色板 - 你抽取位,但不是调色板(如果你开始和24bpp图像没有问题)。 PDF中的位是字节对齐的,而Windows位图中的位是DWORD对齐的;一旦你解决了黑色补丁问题,你可能会看到不同之处。 –

+0

谢谢PDFsharp团队...但我不知道如何提取颜色调色板。你能帮我解决这个问题吗...... – Mugdha

回答

0
img.Save("D:\\trial.png", System.Drawing.Imaging.ImageFormat.Jpeg); 

应该说不是。PNG?

+0

谢谢Joop,我做了这个改变,但结果是一样的 - 一个黑色的补丁。 – Mugdha

0

我已经使用iTextSharp完成了这项工作。以下是我为[filter.Equals(PdfName.FLATEDECODE)]所做的此代码的代码。

添加using System.Runtime.InteropServices;访问元帅

Bitmap bmp = new Bitmap(width, height, pixelFormat); 
var bmd = bmp.LockBits(new System.Drawing.Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, pixelFormat); 
int length = (int)Math.Ceiling(Convert.ToInt32(width) * i_bpp/8.0); 
for (int j = 0; j < height; j++) 
{ 
int offset = j * length; 
int scanOffset = j * bmd.Stride; 
Marshal.Copy(bytes, offset, new IntPtr(bmd.Scan0.ToInt32() + scanOffset), length); 
} 
bmp.UnlockBits(bmd); 
using (FileStream fs = new FileStream(Server.MapPath("~/Temp") + "\\" + String.Format("Image{0}.png", page_i), FileMode.Create, FileAccess.Write)) 
{ 
bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Png); 
PdfImg_ = (System.Drawing.Image)bmp; 
}