web-dev-qa-db-fra.com

Insérer une ligne se brise dans PDF

Je génère un fichier PDF à la volée en utilisant PHP. Mon problème est que je dois insérer des sauts de ligne dans une partie du texte qui sera insérée dans le fichier PDF. Quelque chose comme:

$pdf->InsertText('Line one\n\nLine two');

Donc, il imprime:

Première ligne

Ligne deux

Je sais que \n ne fonctionne pas en PDF, mais connaissez-vous un personnage ou quelque chose qui représente un saut de ligne sur ces fichiers?

31
Carlo

Si vous utilisez fpdf, pour pouvoir utiliser des sauts de ligne, vous devez utiliser une cellule de texte à plusieurs lignes comme décrit ici .

Si vous utilisez cela, les sauts de ligne de votre texte doivent être interprétés et convertis correctement.

Juste un exemple rapide:

$pdf->Multicell(0,2,"This is a multi-line text string\nNew line\nNew line"); 

Ici, 2 est la hauteur de la zone de texte multiligne. Je ne sais pas quelles unités sont mesurées ou si vous pouvez simplement le définir sur 0 et l'ignorer. Peut-être essayez-vous avec un grand nombre si au début cela ne fonctionne pas.

37
thomasrutter

Votre code lit 

$pdf->InsertText('Line one\n\nLine two');

Je ne connais pas la bibliothèque PDF que vous utilisez, mais si vous voulez que\n soit interprété comme un saut de ligne, vous devez utiliser des guillemets doubles en PHP, par exemple.

$pdf->InsertText("Line one\n\nLine two");
15

J'ai changé '\n' pour chr (10) et cela a fonctionné:

$pdf->MultiCell(0,5,utf8_decode($variable1 . chr(10) . $variable2),1);
11
MCR

Vous dites que

2 est la hauteur de la zone de texte multiligne

Non, ce n'est pas .2 est la distance entre les lignes de texte.

Je ne pense pas qu'il existe un moyen réel de calculer la hauteur de la zone de texte résultante réelle, sauf si vous utilisez GetY(), puis soustrayez la valeur Y d'origine utilisée dans votre instruction SetXY() pour placer le Multicell en premier lieu.

6
Nicolas

Une autre option consiste à utiliser TCPDF::Ln() . Il ajoute une ligne au PDF avec la possibilité de définir la hauteur. 

Si les nouvelles lignes se trouvent déjà dans votre contenu, alors - MultiCell() est probablement la voie à suivre, comme d'autres l'ont déjà mentionné, mais j'aime bien utiliser:

$pdf->Cell(0, 0, 'Line 1', 0, 0, 'C');
$pdf->Ln();
$pdf->Cell(0, 0, 'Line 2', 0, 0, 'C');

Cela me confond que Cell() et MultiCell() acceptent des arguments différents, de sorte que j'ai tendance à m'en tenir à utiliser Cell() only En outre, il se lit comme un caractère de nouvelle ligne pour le PDF identique à \n se lit comme un caractère de nouvelle ligne dans le texte ou <br> en HTML. 

5
J.Money

J'ai simplement remplacé le "\n" par le tag "<br>". A bien fonctionné. Il semble que TCPDF rende le texte en HTML

$strText = str_replace("\n","<br>",$strText);
$pdf->MultiCell($width, $height,$strText, 0, 'J', 0, 1, '', '', true, null, true);
5
Prasad Rajapaksha

Après avoir fait tant de cauchemars, j'ai trouvé une solution.

utf8_decode(chr(10))

J'ai essayé \n, <br/> et chr(10) mais rien n'a fonctionné. Ensuite, j'ai réalisé qu'il s'agissait de utf-8 et j'ai juste essayé le précédent. Cela fonctionne bien avec MultiCell mais pas avec Cell.

3
MultiCell($w, $h, 'text<br />', $border=0, $align='L', $fill=1, $ln=0,
    $x='', $y='', $reseth=true, $reseth=0, $ishtml=true, $autopadding=true,
    $maxh=0);

Vous pouvez configurer la MultiCell pour lire le code HTML au niveau de base.

2
dummy
$pdf->SetY($Y_Fields_Name_position);
$pdf->SetX(#);
$pdf->MultiCell($height,$width,"Line1 \nLine2 \nLine3",1,'C',1);

Avant de définir la position X, indiquez d’abord la position Y dans chaque colonne.

Colonne 1

$pdf->SetY($Y_Fields_Name_position);
$pdf->SetX(#);
$pdf->MultiCell($height,$width,"Line1 \nLine2 \nLine3",1,'C',1);

Colonne 2

$pdf->SetY($Y_Fields_Name_position);
$pdf->SetX(#);
$pdf->MultiCell($height,$width,"Line1 \nLine2 \nLine3",1,'C',1);

J'espère que ça aide..

1
zeus2026

Une autre solution (fonctionne avec TCPDF)

Utilisez HEREDOC pour une longue chaîne. Mettre HERDOC pour un CONST par exemple (définir différentes langues) 

$_prepare_const_EN = <<<EOT
this is a long string
and new line as well ...
EOT;

$define('STR_EN', $_prepare_const_EN);

$pdf->InsertText(STR_EN);

fonctionne pour moi très bien ....

0
Ja Loc

C’est peut-être trop tard, mais j’ai résolu ce problème très simplement, J'utilise l’option Multicell et le texte provient d’un formulaire. Si j’utilise un champ de saisie pour obtenir le texte, je ne peux pas insérer de ligne. les ruptures de quelque façon que ce soit, mais si vous utilisez un champ textarea, les sauts de ligne dans la zone de texte sont des sauts de ligne dans le multicellule ... et ça marche, cela fonctionne même si j'utilise l'option utf8_encode($text) pour conserver les accents

0
Felipe