Php 将PDF(透明*和*CMYK)转换为jpg

Php 将PDF(透明*和*CMYK)转换为jpg,php,imagick,Php,Imagick,我需要从PDF文件生成jpg图像(仅第一页)。PDF文件是用户生成的,因此可以包含任何内容。我目前正在使用以下代码: // Load PDF. $i = new Imagick; // Create thumbnail of first page of PDF. $i->setResolution(150, 150); $i->loadImage("test.pdf[0]"); $i->thumbnailImage(640, 480, true); // Remove tr

我需要从PDF文件生成jpg图像(仅第一页)。PDF文件是用户生成的,因此可以包含任何内容。我目前正在使用以下代码:

// Load PDF.
$i = new Imagick;

// Create thumbnail of first page of PDF.
$i->setResolution(150, 150);
$i->loadImage("test.pdf[0]");
$i->thumbnailImage(640, 480, true);

// Remove transparency, fill transparent areas with white rather than black.
$i->setImageBackgroundColor("white");
$i->setImageAlphaChannel(11); // Imagick::ALPHACHANNEL_REMOVE
$i->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

// Output.
$i->writeImage("test.jpg");
在透明度变为白色而不是黑色的情况下,这与预期的一样有效。但是,我遇到了一些生成的jpg图像的问题,因此我对它们运行了
jpeginfo

$ jpeginfo -c test.jpg
test.jpg 960 x 480 32位JFIF N 9481不支持的颜色转换请求[错误]

事实证明,一些源PDF实际上使用CMYK,并且显然在保存为jpg时不会转换为RGB。因此,我将代码更改为以下内容(添加一行)以显式转换为RGB:

// Load PDF.
$i = new Imagick;

// Create thumbnail of first page of PDF.
$i->setResolution(150, 150);
$i->loadImage("test.pdf[0]");
$i->thumbnailImage(640, 480, true);

// Remove transparency, fill transparent areas with white rather than black.
$i->setImageBackgroundColor("white");
$i->setImageAlphaChannel(11); // Imagick::ALPHACHANNEL_REMOVE
$i->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

// Convert to RGB to prevent creating a jpg with CMYK colors.
$i->setImageColorspace(Imagick::COLORSPACE_RGB);

// Output.
$i->writeImage("test.jpg");

这将创建一个带有
RGB
颜色配置文件的jpeg,好的。但是,由于某些模糊的原因,它会再次导致图像背景为黑色。换句话说:透明度问题又回来了。Imagick为什么要这样做,更重要的是,透明度问题和CMYK问题的解决方案是什么?

正确的函数是transformImageColorspace而不是setImageColorspace。TransformImageColorspace用于现有图像,setImageColorspace用于新图像,例如svg绘图


我已将其添加到手册中,很快就会显示出来。

在删除alpha通道之前,尝试将层展平。这太神奇了!它起作用了!实际上,我找到了一个解决方法,但我将更改我的实现。我所做的是
setFormat('png')
然后获取图像blob,将图像blob加载到新的Imagick对象中,然后另存为jpg。