Добавление изображений в pdf резко увеличивает размер, даже если изображения имеют разрешение 72 dpi и 300x300 пикселей.

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

    //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;
    }

person KateMak    schedule 06.11.2014    source источник
comment
Если бы вы могли предоставить пример созданного вами PDF-файла, мы могли бы взглянуть и посмотреть, что на самом деле хранится в PDF-файле и что занимает место. Это может указать вам правильное направление быстрее.   -  person David van Driessche    schedule 09.11.2014


Ответы (1)


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

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

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

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

person I liked the old Stack Overflow    schedule 06.11.2014