web-dev-qa-db-fra.com

Laravel 5.2: Classe Imagick non trouvée

Nous convertissons PDF pages en plusieurs images. Nous avons trouvé un extrait de code dans stackoverflow et l'avons converti en classe de service. Imagick est installé et apparaît dans phpinfo (). Cependant, dans notre application laravel, version 5.2, nous obtenons une erreur de suivi.

ReflectionException in Container.php line 798:
Class Imagick does not exist

Nous avons testé notre code en dehors de l'environnement laravel et il fonctionne à merveille. Aucune erreur de ce type n'est générée. Nous avons également exécuté la commande suivante pour vérifier Imagick

php -i | grep -i imagick

et c'est la sortie

    /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

Tout semble bien. Cela fonctionne en dehors de Laravel mais pas en laravel. Je n'ai aucune idée de ce qui ne va pas. Devons-nous configurer Laravel pour utiliser Imagick?

Voici notre classe de service que nous utilisons

<?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;
    }
}
9
IamGhale

Pouvez-vous essayer d’éditer le fichier php.ini situé dans 
cd /etc/php5/Apache2/php.ini  

si votre linux est Ubuntu? 

cat php.ini | grep extension=imagick.so

s'il y a des résultats de recherche, alors vous pourriez obtenir ceci 
; extension = imagick.so  
Vous supprimez ce point-virgule; et sinon aucun résultat, 

echo "extension=imagick.so" >> /etc/php5/Apache2/php.ini

Et enfin

Sudo /etc/init.d/apahce2 restart

Ça marche avec ce 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
Sishir Pokhrel

C'est ce qui a fonctionné pour moi pour Laravel 5.7 sur Homestead:

Sudo apt-get update && Sudo apt-get install -y imagemagick php-imagick && Sudo service php7.2-fpm restart && Sudo service nginx restart

Si vous utilisez une version de PHP autre que la version 7.2 ou n'utilisez pas Nginx, vous devrez vous adapter.

2
Ryan

Essaye ça:

  1. Téléchargez l’extension ici (la archive): http://pecl.php.net/package/imagick

(Supposons que vous utilisiez la version: 3.4.3)

  1. Accédez au répertoire de postes avec le terminal Exemple

    cd /Downloads/
    
  2. Extraire l'archive

    tar xf imagick-3.4.3.tgz
    
  3. Aller au nouveau répertoire extrait

    cd imagick-3.4.3.tgz
    
  4. Phpize the library (la base est écrite en C)

    phpize
    
  5. Courir

    ./configure
    
  6. Courir

    make && make test && make install
    
  7. Allez dans votre fichier php.ini (habituellement dans Ubuntu situé à /etc/php/7.x/cli/php.ini) et ajoutez cette ligne:

    extension=imagick.so 
    

C'est tout. Mettre à jour php

    service php7.2-fpm restart

et le serveur (Apache, nginx ou autre).

0
Luigi Lopez