问题
We are converting PDF pages to multiple single images. We found a code snippet in stackoverflow and converted it to a service class. We have Imagick installed and it shows up in phpinfo() as well. However, in our laravel application, version 5.2, we are getting following error.
ReflectionException in Container.php line 798:
Class Imagick does not exist
We tested our code outside laravel environment and it's working like a charm. No such error is thrown. We also ran following command to check Imagick
php -i | grep -i imagick
and this is the output
/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
Everything seems right. It works outside Laravel but not in laravel. I got no idea what's wrong. Do we have to configure Laravel to use Imagick?
Here is our service class that we are using
<?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;
}
}
回答1:
Can you try editing php.ini located in
cd /etc/php5/apache2/php.ini
if your linux is ubuntu ?
cat php.ini | grep extension=imagick.so
if there is the results of search, then you might get this
;extension=imagick.so
You remove this semicolon ;
and if not any results,
echo "extension=imagick.so" >> /etc/php5/apache2/php.ini
And finally
sudo /etc/init.d/apahce2 restart
It works with this code
<?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);
}
}
回答2:
This is what worked for me for Laravel 5.7 on Homestead:
sudo apt-get update && sudo apt-get install -y imagemagick php-imagick && sudo service php7.2-fpm restart && sudo service nginx restart
If you're using a version of PHP other than 7.2 or aren't using Nginx, you'll need to adjust.
回答3:
Try this:
- Dowload the extension here (the tarball): http://pecl.php.net/package/imagick
(Lets suppose you use the version: 3.4.3)
Go to the extension directory with the terminal Example
cd /Downloads/
Extract the tarball
tar xf imagick-3.4.3.tgz
Go to the new extracted directory
cd imagick-3.4.3.tgz
Phpize the library (is base written in C)
phpize
Run
./configure
Run
make && make test && make install
Go to your php.ini (ussualy in Ubuntu located at /etc/php/7.x/cli/php.ini) and add this line:
extension=imagick.so
That's it. Update php
service php7.2-fpm restart
and the server (apache, nginx or other).
来源:https://stackoverflow.com/questions/37833614/laravel-5-2-class-imagick-not-found