Bonjour,

J'essaye de générer un fichier PDF grace à DOMPDF dans un projet Laravel.
L'image s'affiche correctement lors de la génération de mon template Blade. Par contre l'image ne s'affiche pas dans la génération du fichier PDF (le fichier PDF utilise le template Blade).

Le controleur

 $pdf = domPDF::loadView($blade, compact('cv', 'user', 'cv_certifications', 'cv_skills_nom', 'experiences', 'formations','perso', 'adresse', 'region', 'region_select', 'cv_skills', 'tcontrat'));

// Affichage du fichier PDF dans le viewer du navigateur
return $pdf->stream(); // affichage

Le template

<img src="{{URL::asset($perso[0]->cvp_photo_path)}}" height="auto" width="150">

Merci pour votre aide.

Ce que je veux

J'aimerais que l'image s'affiche dnas le fichier PDF Généré

Ce que j'obtiens

J'obtient aucune erreur dans les logs serveur ni de laravel. L'image ne charge pas dans le fichier PDF mais charge correctement dans le rendu du template.

7 réponses


Hello,

Tente de debug {{URL::asset($perso[0]->cvp_photo_path)}} dans ton PDF (met le en texte au milieu de ton PDF peu importe), pour voir quelle URL il appelle.

blaUUbla
Auteur

Bonjour Azorgh,

Merci pour votre réponse.
Le lien affiché est correcte. De plus l'image s'affiche correctement lorsque le template Blade est affiché.
Par contre le rendu en fichier PDF du template Blade n'affiche pas l'image met un espace vide. Et lorsque je clique sur l'URL affiché de l'image mon navigateur affiche bien l'image.

Cordialement.

Hello,

Il se peut qu'en fonction de ton environnement que le problème apparaisse.
Je m'explique.

Ton PDF se génère correctement.
Ton rendu blade est ok, et l'image avec.

Quand tu rends ton blade, c'est ton client (donc ton navigateur) qui va chercher l'image grâce à son URL. Aucun soucis jusque là.
Quand tu génères un PDF, c'est le serveur qui génère. Et peut être que lui, n'a pas accès à l'URL de ton application ?

Si tu développe en local sur une machine virtuelle par exemple, ton serveur va essayer de trouver "http://mon-application.test/image/1.jpg", mais impossible d'y accéder puisque ton "serveur local" ne peut résoudre cette URL.

C'est à dire que la génération du PDF va fonctionner une fois "en ligne" par exemple. Puisque l'URL sera ouverte à tous, et l'image accessible au serveur lui même.
Sinon, tu peux récupérer les images via les fonctions Laravel / PHP, et l'encoder en base64 pour ne plus avoir ce problème.

J'espère avoir été clair !

blaUUbla
Auteur

Je vois ou tu veux en venir mais je ne pense pas que le problème vienne de là.

Je développe avec un serveur local (géré par laravel) et Laragon pour la base de donnée.
Mon URL est le suivant : http://127.0.0.1:8000/
L'image est stocké dans les dossier du site : C:\Laragon-www\test\public\storage\1\cv\1\photo\IMG_5080.jpg

J'ai essayé avec les deux URL suivant :
http://127.0.0.1:8000/storage/1/cv/1/photo/IMG_5080.jpg (le dossier route pointe bien dans "test/public")
C:\Laragon-www\test\public\storage\1\cv\1\photo\IMG_5080.jpg

La chose étonnante, c'est que dans le fichier PDF, DomPDF crée bien l'espace neccesaire pour l'image ( je le vois au texte qui suis qui est décalé).

Et j'ai les mêmes résultats sur le serveur de production.

Je pense que le problème vient de là.
Ton serveur (php artisan serve je pense), ne dois pas avoir accès à "http://127.0.0.1:8000".

C'est quasi certain. (et c'est "normal").

En ce qui concerne la production, tu peux essayer un wget http://tonsite.fr/storage/1/cv/1/photo/IMG_5080.jpg en SSH ? (si tu as un accès SSH, ou alors écris la commande en PHP). Ca permettra de voir si le serveur lui-même arrive à call ton site.

blaUUbla
Auteur

Depuis l'adresse 127.0.0.1 oui il ne devrait pas y avoir accès. Mais avec l'URL depuis le disque C (C:\Laragon-www\test\public\storage\1\cv\1\photo\IMG_5080.jpg) il devrait y avoir accès non ?

Le serveur à bien accès au fichier. J'ai testé via le PHP. Et le fichier est bien accesible :/

Salut, tes images doivent être chargées avec un chemin absolue ressource_path('...') par exemple, les URL ne sont pas prises en charge sur DOMPDF, contrairement à ce qui est annoncé sur le repo.