IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[FPDF] Les accents ne passent pas avec FPDF


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut [FPDF] Les accents ne passent pas avec FPDF
    Bonjour tout le monde,

    Je crée un PDF à partir d'une requête, j'obtiens alors un tableau avec le matricule, nom, prénom et cote de l'étudiant.

    Le problème, c'est que les accents ne passent pas, ça me donne par exemple :

    M?lissa, V?ronique,...

    J'ai fait une recherche sur le forum, je suis tombé sur cette discution :

    http://www.developpez.net/forums/d34...rset-cest-doc/

    On dit d'utiliser utf8_decode().

    Je me demandais comment je pouvais utiliser cela dans mon code ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
    session_start();
    define('FPDF_FONTPATH','font/');
    require('mysql_table.php');
     
    class PDF extends PDF_MySQL_Table
    {
    	function Header()
    	{
    		//Titre
    		$this->SetFont('Arial','',10);
     
    		$this->Cell(0,6,'Professeur '.$_SESSION['Prenom'].' '.$_SESSION['Nom']. ' ' .$_GET['cours']. ' ' . $_GET['type'].' '.$_GET['categorie']. ' (Page ' . $this->PageNo().' sur'. $this->AliasNbPages(). ' {nb} )'. '      Date : '. date("d/m/y") .'   Signature : ',0,1,'C');
    		$this->Ln(10);
    		if($_GET['etat'] == "true")
    		{
    			$this->Cell(0,6,'Affichage aux valves autorisé',0,1,'C');
    		}
    		else
    		{
    			$this->Cell(0,6,'Affichage aux valves non autorisé',0,1,'C');
    		}
     
    		//Imprime l'en-tete du tableau si nécessaire
    		parent::Header();
    	}
    }
     
    //Connexion a la base
    mysql_connect('localhost','root','mdp');
    mysql_select_db('pharma');
     
    $pdf=new PDF();
    $pdf->Open();
    $pdf->AddPage();
     
    $sql = "SELECT inscrits_en.MATRICULE_ET, etudiants.NOM_ET, etudiants.PRENOM_ET,inscrits_en.NOTE FROM `inscrits_en` LEFT JOIN `etudiants` ON ( inscrits_en.MATRICULE_ET = etudiants.MATRICULE_ET ) WHERE MNEMONIC = '".$_GET['cours']."' AND TYPE_DE_COURS = '".$_GET['type']."' AND CATEGORIE = '".$_GET['categorie']."' ORDER BY NOM_ET, PRENOM_ET";
     
    //Premier tableau : imprime toutes les colonnes de la requete
    $pdf->Table($sql);
     
    //Sortie vers l'écran
    $pdf->Output(I);
    //***Vue que cela ne fonctionne pas avec IE, je dois ajotuer ce code qui crée un fichier temporaire (voir FAQ fpdf)***
    //Détermination d'un nom de fichier temporaire dans le répertoire courant
    $file = basename(tempnam('.', 'tmp'));
    rename($file, $file.'.pdf');
    $file .= '.pdf';
    //Sauvegarde du PDF dans le fichier
    $pdf->Output($file, 'F');
    //Redirection
    header('Location: '.$file);
    ?>
    J'ai essayé ceci mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = utf8_decode($sql);
    $pdf->Table($sql);
    Merci d'avance.

    beegees

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est pas la requete qu'il faut passer en ANSI c'est les resultats qui sont affichés.

    Il faudrait modifier la fonction table.

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ce n'est pas la requete qu'il faut passer en ANSI c'est les resultats qui sont affichés.

    Il faudrait modifier la fonction table.
    Salut Sabotage,

    Merci pour ta réponse.

    Tu me dis que je dois modifier la fonction Table, c'est dans la classe fpdf alors ?

    J'ai trouvé une fonction nommée "Table" dont voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    function Table($query,$prop=array())
    {
    	//Exécute la requęte
    	$res=mysql_query($query) or die('Erreur: '.mysql_error()."<BR>Requęte: $query");
    	//Ajoute toutes les colonnes si aucune n'a été définie
    	if(count($this->aCols)==0)
    	{
    		$nb=mysql_num_fields($res);
    		for($i=0;$i<$nb;$i++)
    			$this->AddCol();
    	}
    	//Détermine les noms des colonnes si non spécifiés
    	foreach($this->aCols as $i=>$col)
    	{
    		if($col['c']=='')
    		{
    			if(is_string($col['f']))
    				$this->aCols[$i]['c']=ucfirst($col['f']);
    			else
    				$this->aCols[$i]['c']=ucfirst(mysql_field_name($res,$col['f']));
    		}
    	}
    	//Traite les propriétés
    	if(!isset($prop['width']))
    		$prop['width']=0;
    	if($prop['width']==0)
    		$prop['width']=$this->w-$this->lMargin-$this->rMargin;
    	if(!isset($prop['align']))
    		$prop['align']='C';
    	if(!isset($prop['padding']))
    		$prop['padding']=$this->cMargin;
    	$cMargin=$this->cMargin;
    	$this->cMargin=$prop['padding'];
    	if(!isset($prop['HeaderColor']))
    		$prop['HeaderColor']=array();
    	$this->HeaderColor=$prop['HeaderColor'];
    	if(!isset($prop['color1']))
    		$prop['color1']=array();
    	if(!isset($prop['color2']))
    		$prop['color2']=array();
    	$this->RowColors=array($prop['color1'],$prop['color2']);
    	//Calcule les largeurs des colonnes
    	$this->CalcWidths($prop['width'],$prop['align']);
    	//Imprime l'en-tęte
    	$this->TableHeader();
    	//Imprime les lignes
    	$this->SetFont('Arial','',11);
    	$this->ColorIndex=0;
    	$this->ProcessingTable=true;
    	while($row=mysql_fetch_array($res))
    		$this->Row($row);
    	$this->ProcessingTable=false;
    	$this->cMargin=$cMargin;
    	$this->aCols=array();
    }
    }
    Vois-tu où je dois changer le code ?

    Merci encore pour ton aide et bon Dimanche.

    beegees

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Apparemment ca se passe dans la fonction Row() pour l'affichage

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Apparemment ca se passe dans la fonction Row() pour l'affichage
    Merci pour ta réponse.

    J'ai tenté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->Row(utf8_decode($row));
    Sans succès.

    J'obtiens ceci :

    MATRICULE_ET NOM_ET PRENOM_ET NOTE
    A r r a
    A r r a
    A r r a
    A r r a
    A r
    J'ai aussi trouvé la fonction Row() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Row($data)
    {
    	$this->SetX($this->TableX);
    	$ci=$this->ColorIndex;
    	$fill=!empty($this->RowColors[$ci]);
    	if($fill)
    		$this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this->RowColors[$ci][2]);
    	foreach($this->aCols as $col)
    		$this->Cell($col['w'],5,$data[$col['f']],1,0,$col['a'],$fill);
    	$this->Ln();
    	$this->ColorIndex=1-$ci;
    }
    Qu'en penses-tu ?

    Merci encore.

    beegees

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$col['a'],$fill);

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$col['a'],$fill);
    Re,

    Merci pour ta réponse.

    ça ne change malheureusement rien.

    J'ai donc mis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$col['a'],$fill);
    J'ai aussi ce problème dans le menu de mon site (voir miniature), le problème ne serait pas ailleurs ?

    Qu'en penses-tu ?

    Merci encore.

    beegees

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans quel encodage est ton fichier PHP ?

  9. #9
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Dans quel encodage est ton fichier PHP ?
    Re,

    Voici l'info demandée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    Voici d'autres infos au cas où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <!-- DW6 -->
    <head>
    <title>Page d'accueil</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <link rel="stylesheet" href="mm_health_nutr.css" type="text/css" />
    Merci pour ton aide.

    beegees

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non ca c'est l'encodage dans lequel tu demandes qu'il soit affiché.
    Regarde dans ton editeur de texte, tu dois avoir l'info.
    Sinon notepad++ peux te le dire aussi.

  11. #11
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Non ca c'est l'encodage dans lequel tu demandes qu'il soit affiché.
    Regarde dans ton editeur de texte, tu dois avoir l'info.
    Sinon notepad++ peux te le dire aussi.
    Merci pour ta réponse et ta patience.

    ça doit être : Europe Centrale (Windows)

    voir miniature.

    Je dois mettre Unicode (UTF-8) ?

    Merci encore pour ton aide.

    beegees

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non il faut rester coherent, si tu es parti en ISO il faut le rester.
    D'ou viennent les élements de ton menu ? ils sont saisis dans un fichier ou dans une base de données ?

  13. #13
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Pour l'import et l'export en excel par exemple (comme je l'ai montré dans l'image ci-dessus) c'est de l'AJAX :

    Code PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php 
    session_start();
    include('../connexion.php');
    //var_dump($_POST);
     
    $Desactiver_Bouton_Cloture = "SELECT * FROM `cours` WHERE MNEMONIC = '".$_POST['nomcours']."' AND TYPE_DE_COURS = '".$_POST['nomtype']."' AND CATEGORIE = '".$_POST['nomcategorie']."'";
     
    //echo $Desactiver_Bouton_Cloture;
     
    $query_Desactiver_Bouton_Cloture = mysql_query($Desactiver_Bouton_Cloture);
     
    $nombre = mysql_num_rows($query_Desactiver_Bouton_Cloture);
     
    //echo "nombre ".$nombre;
     
     
    while ($tab = mysql_fetch_array($query_Desactiver_Bouton_Cloture))
    {
     
    	if($tab['Cloture'] != 1)  
    	{
    		echo '<a href="../Excel/php_writeexcel-0.3.0/example-repeat.php" target="_parent" class="navText"> Excel : Exporter (enregistrement de la liste d\'étudiants dans mon disque dur)</a>';
    	}
    	else
    	{
    		echo '<a href="#" class="navText"> Excel : Exporter (cours clôturé) <br /></a>';	
    	}
     
    }
    ?>
    et voici le code javascript (AJAX) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    function getXhr()
    	{
        	var xhr = null; 
    		if(window.XMLHttpRequest) // Firefox et autres
    		xhr = new XMLHttpRequest(); 
    		else if(window.ActiveXObject){ // Internet Explorer 
    		   try {
    				xhr = new ActiveXObject("Msxml2.XMLHTTP");
    			    } catch (e) {
    			    xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			    }
    			}
    			else { // XMLHttpRequest non supporté par le navigateur 
    			   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    			   xhr = false; 
    			} 
                  return xhr;
    	}
    //ici, on utlise de l'ajax sans écrire quoi que ce soit dans la page, on ne fait qu'appeler du php sans faire de refresh 
     function TextExcel_menu_utilisateur_import(cours,type,categorie)
    	{
    		var xhr = getXhr();
    		xhr.onreadystatechange = function()
    		{
    			if(xhr.readyState == 4 && xhr.status == 200)
    			{
    				leretour = xhr.responseText;
    				//alert(leretour);
    				document.getElementById('div_excel_import').innerHTML=leretour;
     
    	 		}
    		}
     
     
    	//alert(categorie);
     		//j'appelle la page Update_Cloture.php pour mettre a jour la table cours (cloture)
    		xhr.open("POST","../Scripts/Utilisateur/TextExcel_menu_utilisateur_import.php",true);
    		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    		xhr.send("nomcours="+cours+"&nomtype="+type+"&nomcategorie="+categorie);
    	}
    Merci encore pour ton aide.

    beegees

  14. #14
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Donc c'est ici que tu dois mettre le utf-8 decode


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    while ($tab = mysql_fetch_array($query_Desactiver_Bouton_Cloture))
    {
     
    	if($tab['Cloture'] != 1)  
    	{
            echo '<a href="../Excel/php_writeexcel-0.3.0/example-repeat.php" target="_parent" class="navText">'. utf8_decode("Excel : Exporter (enregistrement de la liste d\'étudiants dans mon disque dur").'></a>';
    	}
    	else
    	{
    		echo '<a href="#" class="navText">'.utf8_decode("Excel : Exporter (cours clôturé)").'<br /></a>';	
    	}
     
    }

Discussions similaires

  1. [PDO] Base de données en Unicode mais les accents ne passent pas
    Par seïna dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 30/12/2008, 16h04
  2. [SQL-Server] Les accents ne passent pas entre MS SQL et PHP ?
    Par stephane9422 dans le forum PHP & Base de données
    Réponses: 34
    Dernier message: 17/11/2008, 15h22
  3. Retirer les accents d'une chaine avec MySQL
    Par orus8 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/02/2006, 16h47
  4. [EasyPHP] Les variables ne passent pas sur EasyPHP
    Par b6i6o6 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 10/02/2006, 12h37
  5. Envoie mail incorrect : les accents ne passe pas !
    Par wappyboy dans le forum Modules
    Réponses: 4
    Dernier message: 05/01/2006, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo