PDF到JPG Imagic页面选择

时间:2012-06-20 07:26:20

标签: php pdf image-processing imagemagick imagick

关于如何为命令行执行此操作的大量答案

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]);

它不起作用:)。

4 个答案:

答案 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();
}