【问题标题】:PDF to JPG Imagic page selectionPDF 到 JPG 图像页面选择
【发布时间】:2012-06-20 07:26:19
【问题描述】:

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

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

它没有工作:)

【问题讨论】:

  • “不使用 [] 语法”是什么意思?
  • 抱歉不清楚,更新了我的帖子

标签: php pdf image-processing imagemagick imagick


【解决方案1】:

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

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

因此,我将把它放在一个临时文件中,然后从那里读取它。没有那么优雅,但它会起作用。

【讨论】:

  • 你是对的。我将不得不这样做 - 或者一次只生成一个我想预览的页面。感谢您证实我的怀疑。
【解决方案2】:

我正在将 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();
}

【讨论】:

  • 这是我正在处理的用例以及如何获取数据,然后将其全部作为本地无文件输出到内存中。
【解决方案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();

【讨论】:

  • $im-&gt;setIteratorIndex($i); 可以很好地选择从 pdf 加载的特定“页面”进行操作。
【解决方案4】:

版本 3.0.1 在想象对象的最后一张或第一张图片上

$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-&gt;setIteratorIndex(4) 计数从零开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 2011-08-21
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多