[FPDF] Afficher image BLOB (stockée dans BDD) dans un pdf

Résolu/Fermé
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 - Modifié par chantaussel le 29/06/2014 à 14:46
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 - 9 juil. 2014 à 11:32
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:
<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:

8 réponses

zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
Modifié par zermat le 29/06/2014 à 20:11
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');
1
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
7 juil. 2014 à 20:55
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:

$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!

0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
8 juil. 2014 à 02:42
Si allow_url_fopen est désactivé essayez cette solution :

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');
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
8 juil. 2014 à 10:03
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
$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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
8 juil. 2014 à 11:12
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
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
8 juil. 2014 à 20:49
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!
0
zermat Messages postés 160 Date d'inscription jeudi 19 juin 2014 Statut Membre Dernière intervention 3 juin 2016 16
Modifié par zermat le 9/07/2014 à 02:50
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:

<?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
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
9 juil. 2014 à 11:32
Merci Zermat,

Mais ça ne fonctionne pas, la version php de free n'est que la 4.4, du coup il ne reconnait pas la fonction getimagesizefromstring()...

Merci quand même de ton aide, ça pourra surement servir à d'autres!
0