2016-06-15 3 views
4

Мы конвертируем страницы PDF в несколько отдельных изображений. Мы нашли фрагмент кода в stackoverflow и преобразовали его в класс обслуживания. У нас установлен Imagick, и он появляется в phpinfo(). Однако в нашем приложении laravel, версии 5.2, мы получаем следующую ошибку.Laravel 5.2: Класс Imagick не найден

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 для использования 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

Проблема может быть пространством имен. Попробуйте добавить \ перед оператором использования Imagick. Возможно, Laravel разрешает неправильный класс в контейнере IOC, возможно, он не понимает класс в глобальном пространстве имен. – developernaren

ответ

2

Вы можете попробовать редактирования php.ini, расположенные в
кд /etc/php5/apache2/php.ini

если ваш Linux является ubuntu?

cat php.ini | grep extension=imagick.so 

если есть результаты поиска, то вы можете получить это
, расширение = 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); 
    } 
} 
+0

Мы уже это сделали, добавив расширение = imagick.so в /etc/php5/apache2/php.ini и перезапустив сервер Apache , Мы выполнили все необходимые настройки. Я думаю, что есть проблема с моим ноутбуком. Теперь он работает нормально. Я должен был перезапустить свой ноутбук раньше. В любом случае, спасибо за ваш ответ. – IamGhale

Смежные вопросы