Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
je travail depuis peu avec le framework Zend.
Je dois générer dynamiquement des pdf avec Zend_Pdf.
Je rencontre un problème lorsque je veux définir des retour à la ligne dans mon texte.
Est ce que quelqun aurait une solution à me proposer ?
Merci d'avance et bonne fin de week end.
Hors ligne
Quel est le probleme exactement?
Tu fait des <br /> pour les retours à la ligne? ou des \n ? (si tu fait des <br />, essaye de les remplacer par des \n )
Hors ligne
quand je fais ceci, la balise ou le \n est affiché sur le pdf comme du texte normal
Hors ligne
Ah ba apres avoir fait quelques recherches ...
http://www.developpez.net/forums/archiv … 74167.html
C'est donc possible ....ils n'auraient pas implémentés les sauts de lignes ?(apres il te reste la solution de stoper ton texte, et d'en refaire un autre quelques pixels en dessous) ...
Ca a peut etre changé avec le temps(le topic date un peu...), quelqu'un pour confirmer ?
Hors ligne
rien à voir mais n'oubliez pas qu'il existe des librairies super simple à utiliser pour transformer du html en pdf, donc si vous voulez faire des factures je vous conseille vivement de les utiliser (html2pdf, html2fpdf, tcpdf, etc.).
Hors ligne
La seule solution que j'ai trouvé c'est de découper le texte avec le nombre de caractère maxi par ligne en tenant compte des coupures de mots et de sauter une ligne dans le pdf. Je te mets un bout de code qui m'a permet de convertir des spools en pdf. Tu peux calculer le saut de ligne en fonction de la taille de ta police. Voir wikipedia la méthode de calcul.
foreach ($mesPages as $Page) { // Pour chaque page $pdf->pages[] = ($page = $pdf->newPage($format["format"])); $page->setStyle($style); $y=$format["hauteur"]-$format["marge_t"]; foreach ($Page as $Ligne) { // Pour chaque ligne if(strpos($Ligne,chr(0x0d))) { // Je regarde s'il y a une superposition $maLigne=explode(chr(0x0d),$Ligne); // Si oui je mets dans un array foreach ($maLigne as $superpos) { // Pour chaque ligne superposée $page->drawText($superpos, $format["marge_l"], $y); } } else { $page->drawText($Ligne, $format["marge_l"], $y); } $y-=$format["ligne"]; } $i++; if ($i==$nbrpage) break; }
Hors ligne
Alors un truc. Je ne sais pas du tout comment est montée ta vue, mais en PHP "simple" et avec fpdf, si ton \n est entre quotes '... \n ...', il n'est pas interprété, mais s'il est entre doubles-quotes "... \n ...", là il est interprété.
Avec ZF je doute que ce soit le problème, mais essaye, on ne sait jamais.
Hors ligne
J'ai trouvé une réponse encore plus complète que la mienne ici http://blog.alfbox.net/index.php/2008/0 … -zend-pdf/
mais globalement il fait ce que je t'ai dit c'est à dire calculer la taille des lettres et donc le nombre de caractères maxi par ligne et il saute une ligne.
protected function getWrappedText($string, Zend_Pdf_Style $style,$max_width) { $wrappedText = '' ; $lines = explode("\n",$string) ; foreach($lines as $line) { $words = explode(' ',$line) ; $word_count = count($words) ; $i = 0 ; $wrappedLine = '' ; while($i < $word_count) { /* if adding a new word isn't wider than $max_width, we add the word */ if($this->widthForStringUsingFontSize($wrappedLine.' '.$words[$i] ,$style->getFont() , $style->getFontSize()) < $max_width) { if(!empty($wrappedLine)) { $wrappedLine .= ' ' ; } $wrappedLine .= $words[$i] ; } else { $wrappedText .= $wrappedLine."\n" ; $wrappedLine = $words[$i] ; } $i++ ; } $wrappedText .= $wrappedLine."\n" ; } return $wrappedText ; } /** * found here, not sure of the author : * http://devzone.zend.com/article/2525-Zend_Pdf-tutorial#comments-2535 */ protected function widthForStringUsingFontSize($string, $font, $fontSize) { $drawingString = iconv('UTF-8', 'UTF-16BE//IGNORE', $string); $characters = array(); for ($i = 0; $i < strlen($drawingString); $i++) { $characters[] = (ord($drawingString[$i++]) << 8 ) | ord($drawingString[$i]); } $glyphs = $font->glyphNumbersForCharacters($characters); $widths = $font->widthsForGlyphs($glyphs); $stringWidth = (array_sum($widths) / $font->getUnitsPerEm()) * $fontSize; return $stringWidth; } then you can draw the text easily : $y = 700; $lines = explode("\n",$this->getWrappedText($text,$style_text,400)) ; foreach($lines as $line) { $page2->drawText($line, 140, $y); $y-=15; }
Voila.
Hors ligne