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


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

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

"致命错误:未捕获的异常'Imagick异常'与消息 "提供的文件名无效" 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。不确定这在这种情况下会有所不同...但我是。

UPDATE2:我已经在 HHVM github 存储库上打开了一个问题。 希望他们能修复此错误...在那之前,我在下面标记为正确的答案是一个不错的(尽管很hack)解决方法。

好的...因此,在我的情况下解决此问题的(有点黑客)方法是使用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();

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

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

如果要使用相对路径,则在其上使用 realpath(),这会将相对路径转换为绝对文件路径。

而不是

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

尝试

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