2014-11-06 174 views
0

我使用PDFSharp创建一个PDF文件,但是当我将图像添加到PDF,文件大小上升显着,即使我将我的图像压缩为300x300像素和72dpi分辨率。当我创建一个没有图像的PDF格式,它是关于300KB这是伟大的,但第二个我在这个分辨率和尺寸添加一些图片,它上升到5MB。最多可以添加25张图片,这会使我的pdf变得荒谬。有没有人有什么建议?我已经把我的代码下面压缩我的图片:将图像添加到PDF大大增加了尺寸,即使图像为72dpi和300×300像素

//maxSize = 300x300 and mimetype can be either "image/png" or "image/jpg" 
    public static Bitmap CompressImage(Image currentImage, string mimeType, Size maxSize) 
    { 
     Bitmap myBitmap; 
     ImageCodecInfo myImageCodecInfo; 
     Encoder myEncoder; 
     EncoderParameter myEncoderParameter; 
     EncoderParameters myEncoderParameters; 

     MemoryStream stream = new MemoryStream(); 

     // Create a Bitmap object based on a BMP file. 
     myBitmap = new Bitmap(currentImage); 

     if (currentImage.Width < maxSize.Width && currentImage.Height < maxSize.Height) 
      return myBitmap; 

     if (myBitmap.HorizontalResolution > 72.0f || myBitmap.VerticalResolution > 72.0f) 
      myBitmap.SetResolution(72.0f, 72.0f); 

     Size compressedImageSize = new Size(); 
     compressedImageSize = ResizeToBound(new Size(myBitmap.Width, myBitmap.Height), maxSize); 

     Bitmap compressedBitmap = new Bitmap(myBitmap, compressedImageSize); 
     myBitmap.Dispose(); 

     // Get an ImageCodecInfo object that represents the JPEG codec. 
     myImageCodecInfo = GetEncoderInfo(mimeType); 

     // for the Quality parameter category. 
     myEncoder = Encoder.Quality; 

     // EncoderParameter object in the array. 
     myEncoderParameters = new EncoderParameters(1); 

     // Save the bitmap as a JPEG file with quality level 75. 
     myEncoderParameter = new EncoderParameter(myEncoder, 75L); 
     myEncoderParameters.Param[0] = myEncoderParameter; 
     compressedBitmap.Save(stream, myImageCodecInfo, myEncoderParameters); 

     compressedBitmap.Dispose(); 
     compressedBitmap = new Bitmap(stream); 

     return compressedBitmap; 
    } 

这是GetEncoder辅助函数

public static ImageCodecInfo GetEncoderInfo(String mimeType) 
    { 
     mimeType = mimeType.ToLower(); 

     if (mimeType.Contains("jpg")) 
      mimeType = mimeType.Replace("jpg", "jpeg"); 

     int j; 
     ImageCodecInfo[] encoders; 
     encoders = ImageCodecInfo.GetImageEncoders(); 
     for (j = 0; j < encoders.Length; ++j) 
     { 
      if (encoders[j].MimeType == mimeType) 
       return encoders[j]; 
     } 
     return null; 
    } 

这是ResizeToBound助手功能。

public static Size ResizeToBound(Size image, Size boundingBox) 
    { 
     double widthScale = 0, heightScale = 0; 
     if (image.Width != 0) 
      widthScale = (double)boundingBox.Width/(double)image.Width; 
     if (image.Height != 0) 
      heightScale = (double)boundingBox.Height/(double)image.Height; 

     double scale = Math.Min(widthScale, heightScale); 

     Size result = new Size((int)(image.Width * scale), 
          (int)(image.Height * scale)); 
     return result; 
    } 
+0

如果你可以打一个比方PDF可用,您已经创建,我们可以看看,看看什么是真正被保存到PDF,什么占用的空间。这可能会让你朝正确的方向更快。 – 2014-11-09 13:55:37

回答

0

当你添加了一个JPEG图像,PDF文件,这些JPEG图像通常会因为它们没有任何修饰(通常为JPEG文件复制到不变的PDF文件)添加。

如果PDFsharp无法得到原始JPEG文件,图像将使用无损压缩来添加。

您的图像存储在一个MemoryStream,但随后又读入一个Bitmap。也许这会阻止PDFsharp访问原始的JPEG数据。只是一个疯狂的猜测 - 没有明确的答案可以给你提供的代码片段。

创建临时JPEG文件并通过文件名来PDFsharp会比较慢,但是应该引起更小的文件。也许这也可以用MemoryStreams来完成,但是没有看到你的代码实际上将图像添加到PDF中,这很难说。