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;
}
}
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);
}
}
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.
Essaye ça:
(Supposons que vous utilisiez la version: 3.4.3)
Accédez au répertoire de postes avec le terminal Exemple
cd /Downloads/
Extraire l'archive
tar xf imagick-3.4.3.tgz
Aller au nouveau répertoire extrait
cd imagick-3.4.3.tgz
Phpize the library (la base est écrite en C)
phpize
Courir
./configure
Courir
make && make test && make install
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).