2014-11-06 1 views
0

Я использую PDFSharp для создания pdf-документа, однако, когда я добавляю изображения в pdf, размер файла резко возрастает, хотя я сжатие моих изображений до 300x300 пикселей и разрешение 72dpi. Когда я создаю pdf без изображений, это около 300 КБ, что отлично, но во втором я добавляю несколько изображений с этим разрешением и размером, он достигает 5 МБ. Можно добавить до 25 изображений, что сделало бы мой pdf смешной размер. У кого-нибудь есть предложения? Я разместил свой код для сжатия моих изображений ниже:Добавление изображений в pdf значительно увеличивает размер, даже если изображения 72dpi и 300x300 пикселей

//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, и что занимает пространство. Это может привести вас к правильному направлению быстрее. –

ответ

0

При добавлении изображений JPEG в PDF файлы, эти изображения JPEG обычно будут добавлены как они без каких-либо изменений (как правило, файл JPEG копируется без изменений в файл PDF).

Если PDFsharp не может получить исходный файл JPEG, изображение будет добавлено с использованием сжатия без потерь.

Вы сохраняете изображение в MemoryStream, но затем снова читаете его в Bitmap. Возможно, это препятствует доступу PDFsharp к исходным данным JPEG. Просто дикая догадка - не может быть определен определенный ответ с предоставленными фрагментами кода.

Создание временных файлов JPEG и передача имен файлов в PDFsharp будет медленнее, но должно привести к значительно меньшим размерам файлов. Возможно, это также можно сделать с помощью MemoryStreams, но, не видя кода, который фактически добавляет изображения в PDF, это трудно сказать.