我们正在将PDF页面转换为多个单个图像。我们在stackoverflow中找到了一个代码片段,并将其转换为服务类。我们安装了Imagick,它也出现在phpinfo()中。但是,在我们的laravel应用程序5.2版中,我们遇到了以下错误。
ReflectionException in Container.php line 798:
Class Imagick does not exist
我们在laravel环境之外测试了我们的代码,它的工作就像一个魅力。没有抛出这样的错误。我们还运行了以下命令来检查Imagick
php -i | grep -i imagick
这是输出
/etc/php5/cli/conf.d/20-imagick.ini,
imagick
imagick module => enabled
imagick module version => 3.4.3RC1
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator
Imagick compiled with ImageMagick version => ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
Imagick using ImageMagick library version => ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
imagick.locale_fix => 0 => 0
imagick.progress_monitor => 0 => 0
imagick.skip_version_check => 0 => 0
一切似乎都是对的。它在Laravel外面工作但不在laravel。我不知道出了什么问题。我们是否必须将Laravel配置为使用Imagick?
这是我们正在使用的服务类
<?php
namespace App\Services\Utilities;
use Imagick;
class PdfToImageService
{
/**
* Destination folder where images will be saved
* @var string
*/
protected $destination = 'images/users/';
/**
* Injecting dependencies
*
* @param Imagick $imagick
*/
function __construct(Imagic $imagick)
{
$this->imagick = $imagick;
}
/**
* Convert pdf having multiple pages to multiple single images
*
* 1. Strip document extension
* 2. Convert this document
* 3. Set background color and flatten. It Prevents black background on objects with transparency
* 4. Set image resolution
* 5. Determine number of pages
* 6. Compress Image Quality
* 7. Generate images from each pdf page
* 8. Destroy current imagick session
*
* @param string $fileName
* @return array $convertedImageNames
*/
public function createImages($fileName)
{
$fileName = basename($fileName);
$this->imagick->readImage($fileName);
$this->imagick->setImageBackgroundColor('white');
$this->imagick->setResolution(300,300);
$this->imagick->setImageCompressionQuality(100);
$convertedImageNames = $this->generateImageFromPDFPage(
$fileName, $this->imagick->getNumberImages()
);
$this->imagick->destroy();
return $convertedImageNames;
}
/**
* Loop throught each pdf pages and convert it to image.
* A. Set iterator postion
* B. Set image format
* C. Write Images to destination folder
*
* @param string $fileName
* @param integer $noOfPages
* @return array
*/
private function generateImageFromPDFPage($fileName, $noOfPages)
{
for($i = 0;$i < $noOfPages; $i++) {
$this->imagick->setIteratorIndex($i);
$this->imagick->setImageFormat('jpeg');
$this->imagick->writeImage($this->destination.$fileName.'-'.$i.'.jpg');
$convertedImageNames[$i] = $fileName.'-'.$i.'.jpg';
}
return $convertedImageNames;
}
}
答案 0 :(得分:2)
你能尝试编辑位于
的php.ini吗?
cd /etc/php5/apache2/php.ini
如果你的linux是ubuntu?
cat php.ini | grep extension=imagick.so
如果有搜索结果,那么你可能会得到这个; extension = imagick.so
你删除这个分号;
如果没有任何结果,
echo "extension=imagick.so" >> /etc/php5/apache2/php.ini
最后
sudo /etc/init.d/apahce2 restart
它适用于此代码
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use Imagick;
class GuestController extends BaseController {
public $imagic;
public function __construct(){
$this->imagic = new Imagick();
}
public function test(){
return get_class_methods($this->imagic);
}
}
答案 1 :(得分:2)
sudo apt-get update && sudo apt-get install -y imagemagick php-imagick && sudo service php7.2-fpm restart && sudo service nginx restart
如果您使用的是7.2以外的PHP版本或未使用Nginx,则需要进行调整。
答案 2 :(得分:0)
尝试一下:
(假设您使用的版本:3.4.3)
使用终端转到扩展目录 例子
cd /Downloads/
提取压缩包
tar xf imagick-3.4.3.tgz
转到新的提取目录
cd imagick-3.4.3.tgz
Phpize库(以C语言编写)
phpize
运行
./configure
运行
make && make test && make install
转到您的php.ini(通常在Ubuntu中,位于/etc/php/7.x/cli/php.ini)并添加以下行:
extension=imagick.so
就是这样。更新php
service php7.2-fpm restart
和服务器(Apache,nginx或其他服务器)。