即使图像为72dpi和300x300像素,在pdf中添加图像也会大大增加大小

本文关键字:图像 添加 pdf 增加 72dpi 300x300 像素 | 更新日期: 2023-09-27 18:29:22

我使用PDFSharp创建pdf文档,但当我将图像添加到pdf中时,文件大小会急剧增加,即使我将图像压缩到300x300像素和72dpi分辨率。当我创建一个没有图像的pdf时,它大约是300kb,这很好,但当我以这个分辨率和大小添加一些图像时,它就达到了5mb。最多可以添加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;
    }

即使图像为72dpi和300x300像素,在pdf中添加图像也会大大增加大小

当您将JPEG图像添加到PDF文件中时,这些JPEG图像通常会原样添加,而不会进行任何修改(通常JPEG文件会原封不动地复制到PDF文件)。

如果PDFsharp无法获得原始JPEG文件,则会使用无损压缩添加图像。

您将图像存储在MemoryStream中,但随后将其再次读取到Bitmap中。也许这会阻止PDFsharp访问原始JPEG数据。这只是一个疯狂的猜测——你提供的代码片段无法给出确切的答案。

创建临时JPEG文件并将文件名传递给PDFsharp会更慢,但会导致文件更小。也许这也可以用MemoryStream来完成,但如果看不到真正将图像添加到PDF中的代码,这就很难说了。