将 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]");
我正在使用 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]");