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] Chevauchement de lignes après passage ISO vers UTF-8


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut [FPDF] Chevauchement de lignes après passage ISO vers UTF-8
    Bonjour,

    Je suis passé récemment d'ISO à UTF-8.

    Pour les PDF avec FPDF j'ai choisi de reconvertir en ISO avec la fonction PHP iconv ().

    Cela marche correctement mais avec array j'ai parfois des lignes qui se chevauchent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pdf->Row(array(iconv ('UTF-8', 'cp1252//TRANSLIT', $text) . ' x ' . $nb['qt'] . ' = ' . number_format ($nb['ht'] * $nb['qt'], 2, ',', ' '));
     
    $pdf->Row(array($aquit . '.',''));
    Cela semble aléatoire, parfois bon affichage, parfois non.


    Connaissez-vous ce problème ?

    Cela me donne envoie de passer à tFPDF qui est la version UTF-8 de FPDF.

    Qu'en pensez-vous ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par boteha Voir le message
    ...Cela me donne envie de passer à tFPDF qui est la version UTF-8 de FPDF...
    Ça me parait judicieux, en effet.


    D'autant que tous les caractères UTF-8 ne peuvent pas être (re)convertis en ISO !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Merci de ton suivi.

    Je n'ai pas de problème avec l'affichage des caractères.

    Par contre ce sont les retours à la ligne avec array() qui sont gérés de façon totalement aléatoire, parfois bien et parfois mal avec dans ce cas superposition des lignes.

    Je vais donc essayer de migrer vers tFPDF ce qui ne semble pas totalement évident d'après ce que j'ai lu.

    Je vous tiens informés.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    J'ai un problème pour commencer.

    Dans FPDF j'ai un fichier d'extension extérieur à la classe :

    class PDF extends FPDF

    Avec à l'intérieur Header (), Footer, etc, et aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function SetWidths($w)
    {
        //Tableau des largeurs de colonnes
        $this->widths=$w;
    }
    Dans le script qui fabrique le PDF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdf->SetWidths(array(140,40));
    Pour passer à tFPDF, j'ai modifié :

    class PDF extends tFPDF

    Mais je me prend une erreur fatale :

    Call to undefined method tFPDF::SetWidths()

    Je ne vois pas où est mon erreur.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- Après recherche et lecture (rapide) de la doc FPDF, on trouve :
    • FPDF : v1.81 (20/12/2015) (voir l'onglet "Télécharger")
    • tFPDF : Ian Back (19/06/2010) (voir l'onglet "Scripts")

    Du coup, il semble que tFPDF n'est pas à jour par rapport à la dernière version de FPDF.


    2- Si on en revient à FPDF :
    Citation Envoyé par boteha Voir le message
    ...Pour les PDF avec FPDF j'ai choisi de reconvertir en ISO avec la fonction PHP iconv()...
    Dans la plupart des discussions trouvées sur le web, on utilise plutôt utf8_decode().
    A mon avis, la solution est à cherché de ce coté là.

    [EDIT] Tiens ! D'ailleurs, c'est écrit dans la FAQ !
    Il ne faut pas utiliser l'encodage UTF-8 avec les polices standards ; elles attendent de l'ISO-8859-1 ou windows-1252. On peut effectuer une conversion en ISO-8859-1 grâce à utf8_decode() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = utf8_decode($str);
    Mais certains caractères comme l'euro ne seront pas correctement traduits. Si vous disposez de l'extension iconv, la bonne manière de faire est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = iconv('UTF-8', 'windows-1252', $str);
    Dans le cas où vous auriez besoin de caractères en dehors de windows-1252, consultez le tutoriel 7 ou bien utilisez tFPDF.

    3- Si ça ne fonctionne toujours pas, il faut que tu crées des TESTS de PDF, avec différents contenus, pour cibler exactement ce qui génère le problème (saut de ligne ? caractère particulier ? ... ?).



    N.B. Je t'avoue que je n'utilise pas FPDF.
    J'utilise plutôt HTML2PDF, qui est basé sur TCPDF (UTF-8)
    Je ne saurai pas t'en dire plus...
    Dernière modification par Invité ; 09/09/2018 à 11h49.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    Merci de ton suivi.

    Le problème semble totalement aléatoire, par exemple :

    S'affiche bien :
    VDIB17726B12 : Connecteur RJ45, Cat6, blindé SFTP (STP), S-One, Schneider-Infraplus – Cat6,
    Blindé SFTP (STP), 12 pièces (argent) | Schneider
    55,50 x 3 = 166,50
    TVA unitaire : 11,10.

    S'affiche mal :
    755141 : Ventilateur, 12 x 12 cm, pour baie 19 pouces – 12 (L) x 12 (H) cm, 2 pièces (noir) |
    Dexlan
    58,31 x 1 = 58,31
    TVA unitaire : 11,66.

    Ce qui s'affiche mal va toujours mal s'afficher mais je ne vois pas où sont les caractères spéciaux que l'on ne trouve pas dans ce qui s'affiche bien.

    Je ne vois pas pourquoi utf8_decode marcherait mieux que iconv, je vais quand même essayer.

    Dans le manuel de référence de FPDF, les méthodes SetWidths, SetAligns ou Row n’apparaissent plus.

    J'utilise la version 1.81 de FPDF et la version 1.25 de tFPDF qui est de 2018-03-19.

    Je me demande simplement si les fonctions de tableau n'ont pas été abandonnées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdf->Row(array($aquit . '.',''));
    Il faudrait alors utiliser Cell ou MultiCell à la place, ce qui doit être possible.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Je me demande si ce n'est pas simplement l'extension de classe qui est mal appelée.

    Dans le script FPDF :

    class PDF extends FPDF

    J'ai juste remplacé pour le script tFPDF

    class PDF extends tFPDF

    Mais ça ne marche pas.

    Qu'en penses-tu ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    ...tFPDF qui est de 2018-03-19...
    Ça, je n'avais pas vu.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class PDF extends tFPDF
    Je ne saurais pas dire...

    Si tu dis que certaines méthodes n'existent plus...
    As-tu vérifier dans la classe tFPDF ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    je pense que le problème est que je n'arrive pas à charger mon extension de classe.

    Dans tFPDF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Header()
    {
    	// To be implemented in your own inherited class
    }
    Dans un fichier externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class PDF extends tFPDF
     
    function Header ()
    {
    Code complet...
    }
    Le script s'exécute mais le PDF est édité sans le contenu demandé par Header ().

    Je ne comprends pas bien car cela fonctionne correctement avec FPDF :

    class PDF extends FPDF

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    J'ai trouvé.

    L'extension renomme la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class PDF extends tFPDF
     
    $pdf=new PDF();
    Et non $pdf=new tFPDF(); comme je faisais.

    J'ai le Header et les fonctions de tableau fonctionnent.

    Reste maintenant à appeler une fonte UTF-8.

    C'est vaguement expliqué ici.

    Je n'ai pas bien compris s'il est possible d’utiliser autre chose que la police DejaVu fournie avec tFPDF, Arial par exemple.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    J'ai réglé quasiment tous les problème sauf un de taille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $pdf=new PDF();
     
    $pdf->AddPage();
    $pdf->AliasNbPages();
     
    $pdf->AddFont('DejaVu', '', 'DejaVuSerif.ttf', TRUE);
    $pdf->AddFont('DejaVu', 'B', 'DejaVuSans-Bold.ttf', TRUE);
    $pdf->AddFont('DejaVu', 'I', 'DejaVuSans-Oblique.ttf', TRUE);
    Et quand j'exécute le script :

    FPDF error: Undefined font: dejavu

    Dans la doc il est écrit :
    // Définition facultative du répertoire des polices systèmes
    // Sinon tFPDF utilise le répertoire [chemin vers tFPDF]/font/unifont/

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    C'est assez énervant.

    Dans leur script d'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Ajoute une police Unicode (utilise UTF-8)
    $pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
    $pdf->SetFont('DejaVu','',14);
    Dans mon script de test, j'appelle la même police de la même manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pdf=new PDF();
     
    $pdf->AddPage();
    $pdf->AliasNbPages();
     
    $pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
    $pdf->SetFont('DejaVu','',10);
    L'exemple fonctionne mais pas mon test.

    FPDF error: Unsupported font type:

    Mon script est en dehors du dossier tFPDF alors que ex.php est dans le dossier, ceci explique peut-être cela mais je ne vois pas comment.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut certainement indiquer le chemin relatif correct.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Il me semble que j'ai déjà essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define ('FPDF_FONTPATH', 'tFPDF/ront/unifont');
    J'essaye demain et vous tiens au courant, j'en ai trop bavé aujourd'hui.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    J'ai poursuivi mes tests aujourd'hui et cela reste mystérieux.

    Si j'exécute le fichier d'exemples en dehors du dossier, cela fonctionne sans warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    require('tFPDF/tfpdf.php');
     
    $pdf = new tFPDF();
    $pdf->AddPage();
     
    // Ajoute une police Unicode (utilise UTF-8)
    $pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
    $pdf->SetFont('DejaVu','',14);
    Si J'exécute mon script avec le même appel de police :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
    tFPDF error: Unsupported font type:

    C'est le deuxième argument de la fonction qui détermine le type.

    Type '' fonctionne pour l'exemple mais pas pour mon script.

    Cela devient trop tordu et je vais aller sur le forum de FPDF, je ne dois pas être premier à souffrir d'un passage en UTF-8 et avoir du mal avec tFPDF.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    J'ai trouvé le bug pour le chevauchement de lignes.

    Dans une extension de la classe, j'avais remplacé la fonction strlen par mb_strlen.

    Je pensais que dans un script pour utf-8, dans un fichier utf-8, il fallait que les fonctions de chaînes soient multi-octets.

    Mais non ! tfpdf.php n'emploie que des fonctions sans mb.
    Si quelqu'un peut m'expliquer pourquoi...

    Actuellement j'utilise tfpdf mais avec une police Arial non unicode qui suppose donc le lardage de iconv ().
    Cela marche très bien.

    La prochaine étape est l'emploi d'une police utf-8.
    Ce n'est pas une urgence mais je vous tiendrai au courant.

Discussions similaires

  1. Mise en ligne après migration vers la nouvelle version
    Par devalender dans le forum MkFramework
    Réponses: 2
    Dernier message: 03/07/2018, 23h34
  2. [MySQL-5.1] Problème LEFT JOIN après passage d'Access vers MySQL
    Par Christophe P. dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/11/2015, 16h18
  3. Réponses: 6
    Dernier message: 27/09/2013, 16h43
  4. [XL-2003] Symbole de retour à la ligne apres copie de textbox vers cellule
    Par altra dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 17/09/2009, 13h12
  5. [langage] split ligne apres ligne ?
    Par simos dans le forum Langage
    Réponses: 17
    Dernier message: 25/06/2004, 15h07

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