[FPDF] Afficher image BLOB (stockée dans BDD) dans un pdf
Résolu
chantaussel
Messages postés
137
Date d'inscription
Statut
Membre
Dernière intervention
-
chantaussel Messages postés 137 Date d'inscription Statut Membre Dernière intervention -
chantaussel Messages postés 137 Date d'inscription Statut Membre Dernière intervention -
Bonjour :)
Je cherche à afficher sur un pdf une image qui se trouve dans une BDD en format BLOB. Je ne souhaite pas entrer dans le débat "stocker des images dans une BDD c'est bien/c'est pas bien". Merci de ne pas me proposer comme solution de ne pas stocker mes images dans la BDD...
L'image s'affiche parfaitement sur une page HTML lorsqu'on met dans la balise le chemin la page php qui récupère l'image dans la BDD et l'affiche:
J'utilise la classe FPDF pour générer des fichier pdf. Pour afficher mon image sur un pdf voilà ce que j'ai essayé jusque là:
1/ La méthode Image(), en mettant en 1er argument l'URL absolue de la page php qui affiche mon image.
Code:
Message d'erreur:
2/ La méthode MemImage() (développé dans un script intitulé "Support des images en mémoire"), en mettant le contenu binaire du blob en 1er argument.
Code:
Message d'erreur:
3/ La méthode MemImage() et la fonction imagecreatefromstring()
Code:
Même message d'erreur qu'au dessus...
Merci d'avance pour votre aide!
Quelques bases en javascript, débute en php/mySQL
J'essaie de mettre en ligne mon arbre généalogique.
Je cherche à afficher sur un pdf une image qui se trouve dans une BDD en format BLOB. Je ne souhaite pas entrer dans le débat "stocker des images dans une BDD c'est bien/c'est pas bien". Merci de ne pas me proposer comme solution de ne pas stocker mes images dans la BDD...
L'image s'affiche parfaitement sur une page HTML lorsqu'on met dans la balise le chemin la page php qui récupère l'image dans la BDD et l'affiche:
<img src="afficheimmage.php?var=1" />
J'utilise la classe FPDF pour générer des fichier pdf. Pour afficher mon image sur un pdf voilà ce que j'ai essayé jusque là:
1/ La méthode Image(), en mettant en 1er argument l'URL absolue de la page php qui affiche mon image.
Code:
$pdf->Image('http://monsite.fr/afficheimmage.php?var=1',60,30,90,0,'JPG');
Message d'erreur:
Warning: getimagesize(http://monsite.fr/afficheimmage.php?var=1) [function.getimagesize]: failed to open stream: Network is unreachable in /mnt/154/sdb/8/5/monsite/fpdf.php on line 1213
FPDF error: Missing or incorrect image file: http://monsite.fr/afficheimmage.php?var=1
2/ La méthode MemImage() (développé dans un script intitulé "Support des images en mémoire"), en mettant le contenu binaire du blob en 1er argument.
Code:
$pdf->MemImage($DonneesBlob, 50, 30);
Message d'erreur:
Warning: Trop curieux... in /mnt/154/sdb/8/5/monsite/mem_image.php on line 70
Warning: getimagesize(var://imgb5b45906d51496c840e1f08a9032eb16) [function.getimagesize]: failed to open stream: no suitable wrapper could be found in /mnt/154/sdb/8/5/monsite/mem_image.php on line 70
FPDF error: Invalid image data
3/ La méthode MemImage() et la fonction imagecreatefromstring()
Code:
$image = imagecreatefromstring($DonneesBlob);
$pdf->MemImage($image, 50, 30);
Même message d'erreur qu'au dessus...
Merci d'avance pour votre aide!
Quelques bases en javascript, débute en php/mySQL
J'essaie de mettre en ligne mon arbre généalogique.
A voir également:
- Fpdf image
- Image iso - Guide
- Acronis true image - Télécharger - Sauvegarde
- Reduire taille image - Guide
- Légender une image - Guide
- Image gratuite - Guide
8 réponses
Essayez:
$image = file_get_contents('http://monsite.fr/afficheimmage.php?var=1'); //vérifier que allow_url_fopen = On dans php.ini $pdf->Image('var://image', 60, 30, 90, 0, 'JPEG');
Merci zermat :)
Me revoilà bien en retard, désolée...
J'ai essayé ce que tu proposes, et ça ne marche pas... Je n'ai pas eu de confirmation officielle, mais il semble que chez free allow_url_fopen = off, et on ne peut rien changer. J'ai lu aussi (mais c'est à confirmer) que free bloque certaines fonctions telles que file_get_contents().
Ceci étant dit je me pose les questions suivantes:
1/ Mon image est dans une BDD, pour l'afficher avec mon script php grâce au fichier afficheimmage.php?var=1, je vais déjà récupérer l'image en binaire, et la stoker dans une variable ($imagebdd). Il me semble que c'est ce que fait la fonction file_get_contents(), qui retourne une image sous forme de chaine? non?
Donc est-ce qu'on pourrait pas mettre tout simplement:
J'ai essayé, ça ne fonctionne pas non plus... mais peut-être est-ce à creuser?
2/ Je ne connait pas du tout le code: 'var://image', comment est-ce-que ça fonctionne?
3/ Pourquoi mettre le chemain en absolu dans file_get_contents()? En le mettant en relatif, est-ce-que ça ne résoudrait pas le problème d'url de allow_url_fopen = off
Merci d'avance!
Me revoilà bien en retard, désolée...
J'ai essayé ce que tu proposes, et ça ne marche pas... Je n'ai pas eu de confirmation officielle, mais il semble que chez free allow_url_fopen = off, et on ne peut rien changer. J'ai lu aussi (mais c'est à confirmer) que free bloque certaines fonctions telles que file_get_contents().
Ceci étant dit je me pose les questions suivantes:
1/ Mon image est dans une BDD, pour l'afficher avec mon script php grâce au fichier afficheimmage.php?var=1, je vais déjà récupérer l'image en binaire, et la stoker dans une variable ($imagebdd). Il me semble que c'est ce que fait la fonction file_get_contents(), qui retourne une image sous forme de chaine? non?
Donc est-ce qu'on pourrait pas mettre tout simplement:
$image = $imgbdd;Au lieu de
$image = file_get_contents('http://monsite.fr/afficheimmage.php?var=1');
J'ai essayé, ça ne fonctionne pas non plus... mais peut-être est-ce à creuser?
2/ Je ne connait pas du tout le code: 'var://image', comment est-ce-que ça fonctionne?
3/ Pourquoi mettre le chemain en absolu dans file_get_contents()? En le mettant en relatif, est-ce-que ça ne résoudrait pas le problème d'url de allow_url_fopen = off
Merci d'avance!
Si allow_url_fopen est désactivé essayez cette solution :
vous pouvez ajouter en fin de code :
unlink('mon-image.jpg');
file_put_contents('mon-image.jpg',$imgbdd); $pdf->Image('mon-image.jpg',60,30,90,0,'JPG');
vous pouvez ajouter en fin de code :
unlink('mon-image.jpg');
Merci de ta réponse Zermat,
Oui je m'étais dit qu'en dernier recours je passerai par cette solution, qui crée un fichier.jpg temporairement pour pourvoir inclure l'image sur mon pdf...
Mais je vais creuser encore un peu le script de MemImage de FPDF.
Et puis je ne comprends toujours pas pourquoi les solutions du dessus ne fonctionnent pas. Quelles sont les restrictions de la méthode Image de FPDF? Pourquoi est-ce que
ni
ni
ne fonctionnent?
Après tout afficheimmage.php?var=1 ça représente bien l'url de mon image?
Bon, ça fait beaucoup de questions...
Merci!
Oui je m'étais dit qu'en dernier recours je passerai par cette solution, qui crée un fichier.jpg temporairement pour pourvoir inclure l'image sur mon pdf...
Mais je vais creuser encore un peu le script de MemImage de FPDF.
Et puis je ne comprends toujours pas pourquoi les solutions du dessus ne fonctionnent pas. Quelles sont les restrictions de la méthode Image de FPDF? Pourquoi est-ce que
ni
$pdf->Image('http://monsite.fr/afficheimmage.php?var=1',60,30,90,0,'JPG');(en absolu)
ni
$pdf->Image('afficheimmage.php?var=1',60,30,90,0,'JPG');(en relatif)
ne fonctionnent?
Après tout afficheimmage.php?var=1 ça représente bien l'url de mon image?
Bon, ça fait beaucoup de questions...
Merci!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bon, je viens de vérifier avec phpinfo(), et allow_url_fopen est bien sur ON sur les pages perso de free...
Je vais vérifier mes variables (j'utilise des variables de sessions) et voir si elles se transmettent bien.
Merci
Je vais vérifier mes variables (j'utilise des variables de sessions) et voir si elles se transmettent bien.
Merci
Alors, pour conclure tout ça, même avec allow_url_fopen sur ON, free.fr a réussi à bloquer l'utilisation des "stream wrappers" ou "gestionnaires de flux".
Le script MemImage fonctionne parfaitement en local, mais plus sur un serveur de free...
Merci Olivier de FPDF!
Deux dernière solutions:
1/ passer par un fichier .jpg temporaire comme le proposait zermat
2/ virer toutes mes images de la BDD et tout mettre dans un dossier...
Je crois que je vais prendre la 2ème solution...
Merci pour votre aide!
Le script MemImage fonctionne parfaitement en local, mais plus sur un serveur de free...
Merci Olivier de FPDF!
Deux dernière solutions:
1/ passer par un fichier .jpg temporaire comme le proposait zermat
2/ virer toutes mes images de la BDD et tout mettre dans un dossier...
Je crois que je vais prendre la 2ème solution...
Merci pour votre aide!
Si vous ne voulez pas créer une image temporaire je vous propose cette classe :
créer un fichier fpdf2.php à côté du fichier fpdf.php avec ce contenu:
pour utiliser cette classe mettez:
Cette classe nécessite php-5.3 ou plus pour fonctionner
créer un fichier fpdf2.php à côté du fichier fpdf.php avec ce contenu:
<?php require_once("fpdf.php"); class FPDF2 extends FPDF { function _parsejpg($file) { $a = getimagesizefromstring($file); if(!$a) $this->Error('Missing or incorrect image file: '.$file); if($a[2]!=2) $this->Error('Not a JPEG file: '.$file); if(!isset($a['channels']) || $a['channels']==3) $colspace = 'DeviceRGB'; elseif($a['channels']==4) $colspace = 'DeviceCMYK'; else $colspace = 'DeviceGray'; $bpc = isset($a['bits']) ? $a['bits'] : 8; $data = $file; return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); } } ?>
pour utiliser cette classe mettez:
require('fpdf2.php'); $pdf = new FPDF2(); . . . $pdf->Image($imagebdd,60,30,90,0,'JPG');
Cette classe nécessite php-5.3 ou plus pour fonctionner