Free Support Forum - aspose.com

Aspose.PDF For NET XImageCollection 替换图像后PDF体积变大

我尝试压缩PDF的大小,但是我无法使用
ImageCompressionOptions.CompressImages = true;
因为他会不定期的抛出内存不足,或其它异常
所以我想了其它的办法,将图像提取出来压缩后再替换进去,这样虽然慢了一些,但不会有什么异常出现
但是我发现了一个问题,我将图像提取出再利用 images.Replace(i stream,30);替换进去以后,PDF积竟然变大了,而我压缩后的图像确实比原图像要小的多,这到底是什么原因造成的呢
我尝试调整images.Replace的第三个参数,但问题依然存在
附上我所用的PDF及压缩后的PDF及导出的图像前后对比,图像文件夹中,附带_s 字样的为压缩后的图片
2011_11.zip (997.7 KB)

  foreach (var page in document.Pages)

{
XImageCollection images = page.Resources.Images;
for (int i = 1; i <= images.Count; i++)
{
using (MemoryStream imgstream = new MemoryStream())
{
if (img.ContainsTransparency)
{
img.Save(imgstream, ImageFormat.Png, 96);
}
else
{
img.Save(imgstream, ImageFormat.Jpeg, 96);
}
using (MemoryStream ostream = new MemoryStream())
{
imageLib.Compress(imgstream, ostream, quality);//压缩图像
images.Replace(i, stream,30);替换图像
}

        }
  }

     document.Save.........

}

我将压缩后的PDF中的图片再次导出来,发现PNG的图像被变大了,可能是这个原因引起的,请问如何解决呢

@icejd

使用上述选项优化PDF文档时,请确保您使用的是x64调试模式。

此外,请分享您用于提取和压缩图像的完整示例代码片段。您上面的共享代码段中有一些未定义的变量,例如img,imgLib等。一旦有了完整的示例代码段,我们将在我们的环境中测试场景并相应地解决它。

imglib中的压缩方法是这样的
public static void Compress(Bitmap srcBitmap, Stream destStream, int level)
{
ImageCodecInfo myImageCodecInfo;
System.Drawing.Imaging.Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
myImageCodecInfo = GetEncoderInfo(type);
myEncoder = System.Drawing.Imaging.Encoder.Quality;
myEncoderParameters = new EncoderParameters(1);
myEncoderParameter = new EncoderParameter(myEncoder, level);
myEncoderParameters.Param[0] = myEncoderParameter;
srcBitmap.Save(destStream, myImageCodecInfo, myEncoderParameters);
destStream.Seek(0, System.IO.SeekOrigin.Begin);
}
至于img变量,就是 XImageCollection images = page.Resources.Images; 这里的对象
是这样的写的
var img = images[i];

另外,这个
ImageCompressionOptions.CompressImages = true;
确实存在问题,不只是内存不足的问题,我用的就是64位的模式,他有的时候还会报未将对象引用到实例的错误
image.png (23.6 KB)

@icejd

我们正在对环境中的问题进行调查,并将尽快与您联系。