将 pdf 的第一页转换为 jpg 时收到无效文件名错误

Receiving invalid filename error when converting first page of pdf to jpg

我正在使用 imagick 在脚本中将 pdf 转换为 jpg...如果我在没有指定页面的情况下提供上传的 pdf 的直接路径,它工作正常,但是当我添加 [0] 到文件路径的末尾以指定我只想阅读第一页,它会爆炸并出现以下错误:

"Fatal error: Uncaught exception 'ImagickException' with message 'Invalid filename provided' Imagick->readImage()"

我也试过直接在构造函数中使用 '/path/to/file.pdf[0]' 但没有成功,但没有页面说明符,也可以正常工作。

根据文档...这应该可行。我在这里做错了什么?

$doc_preview = new Imagick();
$doc_preview->setResolution(180,180);
$doc_preview->readImage('/path/to/file.pdf[0]');
$doc_preview->setImageFormat('jpeg');
$doc_preview->writeImage('/path/to/file.jpg');
$doc_preview->clear();
$doc_preview->destroy();

更新:我应该提到我正在使用 HHVM。不确定在这种情况下这会有所不同......但我是。

更新 2:我已经在 HHVM github 存储库上打开了 an issue。希望他们能修复这个错误……在那之前,我在下面标记为正确的答案是一个不错的(尽管有点老套)解决方法。

我的电脑里没有 imagick,但我能猜到问题出在哪里。问题是,当您打开带有页面部分的 PDF 文件时,您不能包含包含正斜杠的目录路径字符串。 我认为这是因为我从 php.net 此处 http://php.net/manual/en/imagick.readimage.php 阅读了 readImage 功能页面,并且它们不包含目录路径,所以我认为这是一个小问题但仍在继续。 您应该尝试使用 chdir()(http://php.net/manual/en/function.chdir.php) 将目录更改为 PDF 文件,然后在没有目录路径的情况下尝试像这样的相同功能 $doc_preview->readImage('file.pdf[0]');。很可能它会起作用。 有些 API 有问题,您必须解决这些问题。

好的...所以在我的情况下解决此问题的(有点老套)方法是使用 fopen() 然后使用非常直观的 setIteratorIndex(0)。但是对于那些有同样问题的人......好了!

$pdf_handle = fopen('/path/to/file.pdf', 'rb');

$doc_preview = new Imagick();
$doc_preview->setResolution(180,180);
$doc_preview->readImageFile($pdf_handle);
$doc_preview->setIteratorIndex(0);
$doc_preview->setImageFormat('jpeg');
$doc_preview->writeImage('/path/to/file.jpg');
$doc_preview->clear();
$doc_preview->destroy();

readImage() 要求 $filename 是绝对路径。

如果你想使用相对路径,那么使用realpath()就可以了,它将相对路径变成绝对文件路径。

而不是

$imagick->readImage('/path/to/file.pdf[0]');

尝试

$imagick->readImage(realpath("/path/to/file.pdf")."[0]");