2016-06-15 30 views
4

Wir konvertieren PDF-Seiten in mehrere Einzelbilder. Wir haben ein Code-Snippet in Stackoverflow gefunden und in eine Serviceklasse konvertiert. Wir haben Imagick installiert und es zeigt sich auch in phpinfo(). In unserer Laravel-Anwendung, Version 5.2, erhalten wir jedoch folgenden Fehler.Laravel 5.2: Class Imagick nicht gefunden

Wir testeten unseren Code außerhalb Laravel Umgebung und es funktioniert wie ein Charme. Ein solcher Fehler wird nicht ausgelöst. Wir liefen auch folgenden Befehl Imagick

php -i | grep -i imagick 

und dies ist der Ausgang

/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 

Alles scheint richtig zu überprüfen. Es funktioniert außerhalb von Laravel, aber nicht in Laravel. Ich habe keine Ahnung, was los ist. Müssen wir Laravel für Imagick konfigurieren?

Hier ist unsere Service-Klasse, die wir

<?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

Das Problem Namensraum sein könnte. Versuchen Sie, \ vor Imagick use statement hinzuzufügen. Es könnte sein, dass Laravel eine falsche Klasse in einem IOC-Container auflöst, es könnte die Klasse im globalen Namespace nicht verstehen. – developernaren

Antwort

2

können Sie versuchen, die Bearbeitung php.ini in
cd /etc/php5/apache2/php.ini

wenn Ihr Linux befindet verwenden ist ubuntu?

cat php.ini | grep extension=imagick.so 

, wenn die Ergebnisse der Suche ist, dann könnten Sie bekommen diese
; extension = imagick.so
Sie dieses Semikolon entfernen; und wenn keine Ergebnisse,

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

Und schließlich

sudo /etc/init.d/apahce2 restart 

Es funktioniert mit diesem 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); 
    } 
} 
+0

Wir haben das bereits getan, indem wir die Erweiterung = imagick.so in /etc/php5/apache2/php.ini hinzugefügt und den Apache-Server neu gestartet haben . Wir haben alle erforderlichen Vorbereitungen getroffen. Ich denke, es gibt ein Problem mit meinem Laptop. Es funktioniert jetzt gut. Ich hätte meinen Laptop vorher neu starten sollen. Wie auch immer, danke für deine Antwort. – IamGhale