2

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

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

4 回答 4

5

对于那些仍在寻找从 blob 中读取特定页码的解决方案的人,请检查这个问题使用 PHP 和 ImageMagick 创建由 PDF 中的图像填充的数组

$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();
于 2014-03-26T21:46:01.110 回答
4

我正在将 PDF 二进制文件从 Amazon S3 加载到内存中,然后使用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();
}
于 2018-05-26T04:05:50.210 回答
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
}

例如,如果您总共有 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)计数从零开始。

于 2012-09-28T00:22:43.993 回答
2

不幸的是,这不是好消息,但我可以肯定地说,截至撰写本文时,ImageMagick(和 PHP 库)不支持您尝试使用的页面符号。(对于未来发现这一点的人:我正在检查 php-imagick-3.0.1 和 imagemagick-6.6.0.4)。

我正在尝试做和你完全相同的事情,我刚刚花了最后几个小时浏览源代码,试图弄清楚它的作用以及它是如何获取页面的,看起来它根本就不会从流中读取时不要使用它(即 readBlob() 调用)。

因此,我只是将它放在一个临时文件中并从那里读取它。不那么优雅,但它会工作。

于 2012-06-27T12:30:59.250 回答