Laravel 5.2: Class Imagick not found

IamGhale picture IamGhale · Jun 15, 2016 · Viewed 21.1k times · Source

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;
    }
}

Answer

Ryan picture Ryan · Oct 10, 2018

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.