关于如何为命令行执行此操作的大量答案
convert /path/to/file/file.pdf[3] output.jpg
很棒...但是如果我在内存处理中使用,我将使用PDFlib生成PDF,然后将其缓冲区输出到我想要生成所选页面的jpg预览的函数。怎么样?我的代码:
[...]
$buf = $pdf->get_buffer();
//$buff is just a PDF stored in a string now.
$im = new Imagick();
$im->readimageblob($buf);
$im->setImageFormat("jpg");
$im->setimagecompressionquality(60);
$len = strlen($im);
header("Content-type: image/jpeg");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=test.jpg");
echo $im;
这会创建一个jpeg,但始终返回PDF的最后一页。我希望能够选择转换哪一个。如果不保存临时文件并使用命令行(exec('convert /path/to/file/file.pdf[3] output.jpg'))
语法,它是否可行?
让我补充说我试过
$im->readimageblob($buf[2]);
它不起作用:)。
答案 0 :(得分:3)
版本3.0.1 在最后的图像或在imagic对象中的第一个图像
$image_obj = new Imagick("test.pdf");
然后你在$ image_obj的最后一张图片
如果您使用
fp_pdf = fopen("test.pdf", 'rb');
$image_obj = new Imagick();
$image_obj -> readImageFile($fp_pdf);
然后你在$ image_obj
的第一张图片上在第二种情况下,您可以切换到最后一张图像
fp_pdf = fopen("test.pdf", 'rb');
$image_obj = new Imagick();
$image_obj -> readImageFile($fp_pdf,2); // 2 can be any positive number?
然后你在$ image_obj的最后一张图片
echo $image_obj->getNumberImages() // Returns the number of images in the object
然后
if ($image_obj->hadPreviousImage)
$image_obj->previousImage() //Switch to the previous image in the object
}
或
if ($image_obj->hasNextImage()) {
$image_obj->nextImage()) //Switch to the next image in the object
}
e.g。如果您总共有6张图片,那么您需要第4张,然后从最后开始
$image_obj->previousImage()
$image_obj->previousImage()
$image_obj->setImageFormat("png");
header("Content-Type: image/png");
echo $image_obj;
编辑:另一个发现是你可以
foreach($image_obj as $slides) {
echo "<br>".$Obj_img->getImageWidth();
//or wehatever you need to do.
}
编辑2:非常简单的解决方案是使用此函数$image_obj->setIteratorIndex(4)
计数从零开始。
答案 1 :(得分:3)
对于仍在寻找从blob读取特定页码的解决方案的人,请查看此问题Creating array populated by images from a PDF using PHP and ImageMagick
$img_array = array();
$im = new imagick();
$im->setResolution(150,150);
$im->readImageBlob($pdf_in);
$num_pages = $im->getNumberImages();
for($i = 0;$i < $num_pages; $i++)
{
$im->setIteratorIndex($i);
$im->setImageFormat('jpeg');
$img_array[$i] = $im->getImageBlob();
}
$im->destroy();
答案 2 :(得分:1)
遗憾的是,这不是好消息,但我可以肯定地说,截至撰写本文时,ImageMagick(和PHP库)不支持您尝试使用的页面符号。 (对于未来发现这一点的人:我正在检查php-imagick-3.0.1和imagemagick-6.6.0.4)。
我正在尝试做与你完全相同的事情,我只花了最后几个小时在源头上拖网,试图找出它的作用以及它如何获取页面,它看起来像它从流中读取(即readBlob()调用)时,根本不会使用它。
因此,我只是将它放在一个临时文件中,然后从那里读取它。不那么优雅,但它会起作用。
答案 3 :(得分:0)
我正在从Amazon S3将PDF二进制文件加载到内存中,然后使用 setIteratorIndex()选择我想要的特定页面,然后选择 getImage()
function get_image_from_pdf($pdf_bytes, $page_num){
$im = new \Imagick();
$im->setResolution(150, 150);
$im->readImageBlob($pdf_bytes);
$im->setIteratorIndex($page_num);
$im = $im->getImage();
$im->setImageFormat('png');
return $im->getImageBlob();
}