2014-11-06 181 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中,這很難說。