web-dev-qa-db-ja.com

Laravel 5.2:クラスImagickが見つかりません

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では機能しません。何が問題なのかわかりませんでした。Imagickを使用するには、Laravelを構成する必要がありますか?

これが私たちが使用しているサービスクラスです

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

これは私にとってLaravel 5.7 for Homesteadでうまくいったものです:

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

PHP 7.2以外のバージョンを使用している場合、またはNginxを使用していない場合は、調整する必要があります。

3
Ryan

にある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);
    }
}
2
Sishir Pokhrel

これを試して:

  1. 拡張機能をここにダウンロード(tarball): http://pecl.php.net/package/imagick

(次のバージョンを使用するとします:3.4.3)

  1. ターミナルのある拡張ディレクトリに移動します例

    cd /Downloads/
    
  2. Tarballを抽出します

    tar xf imagick-3.4.3.tgz
    
  3. 新しく抽出したディレクトリに移動します

    cd imagick-3.4.3.tgz
    
  4. ライブラリをPhpizeします(ベースはCで書かれています)

    phpize
    
  5. 走る

    ./configure
    
  6. 走る

    make && make test && make install
    
  7. Php.ini(Ubuntuでは/etc/php/7.x/cli/php.iniにあります)に移動し、次の行を追加します。

    extension=imagick.so 
    

それでおしまい。 PHPを更新

    service php7.2-fpm restart

サーバー(Apache、nginxなど)。

0
Luigi Lopez