web-dev-qa-db-ger.com

Einfügen von Zeilenumbrüchen in PDF

Ich generiere schnell eine PDF -Datei mit PHP. Mein Problem ist, dass ich Zeilenumbrüche in einen Teil des Texts einfügen muss, der in die Datei PDF eingefügt wird. So etwas wie:

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

So druckt es:

Zeile eins

Zeile zwei

Ich weiß, dass \n nicht für PDF funktioniert, aber kennen Sie einen Charakter oder etwas, das einen Zeilenumbruch in diesen Dateien darstellt?

31
Carlo

Wenn Sie fpdf verwenden, um Zeilenumbrüche verwenden zu können, müssen Sie eine mehrzeilige Textzelle wie hier beschrieben verwenden .

Wenn Sie dies verwenden, sollten Zeilenumbrüche in Ihrem Text richtig interpretiert und konvertiert werden.

Nur ein kurzes Beispiel:

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

Hier ist 2 die Höhe des mehrzeiligen Textfelds. Ich weiß nicht, in welchen Einheiten gemessen wird oder ob Sie sie einfach auf 0 setzen und ignorieren können. Vielleicht versuchen Sie es mit einer großen Anzahl, wenn es zuerst nicht funktioniert.

37
thomasrutter

Ihr Code liest 

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

Ich weiß nicht, welche PDF -Bibliothek Sie verwenden, aber normalerweise, wenn\n als Zeilenumbruch interpretiert werden soll, müssen Sie in PHP Anführungszeichen verwenden, z.

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

Ich habe '\n' für chr (10) geändert und es hat funktioniert:

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

Du sagst das

2 ist die Höhe des mehrzeiligen Textfelds

Nein, es ist nicht .. 2. 2 ist der Abstand zwischen den Textzeilen.

Ich glaube nicht, dass es eine echte Möglichkeit gibt, die Höhe des tatsächlich resultierenden Textfelds zu berechnen, es sei denn, Sie verwenden GetY() und ziehen dann den ursprünglichen Y-Wert ab, der in Ihrer SetXY()-Anweisung zum Platzieren des Multicells verwendet wird.

6
Nicolas

Eine andere Option ist die Verwendung von TCPDF::Ln() . Es fügt der PDF eine Zeile hinzu mit der Option zum Einstellen der Höhe. 

Wenn sich die Zeilenumbrüche bereits in Ihrem Inhalt befinden, ist MultiCell() wahrscheinlich der richtige Weg, wie andere bereits erwähnt haben.

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

Es verwirrt mich, dass Cell() und MultiCell() unterschiedliche Argumente zulassen, also neige ich dazu, nur Cell() zu verwenden. Es liest sich wie ein Zeilenvorschubzeichen für PDF, genauso wie \n wie ein Zeilenumbruchzeichen in Text oder <br> in HTML. 

5
J.Money

Ich habe einfach den "\n" durch den Tag "<br>" ersetzt. Funktionierte gut. Es scheint, als würde TCPDF den Text als HTML darstellen

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

Nachdem ich so viele Albträume hatte, fand ich eine Lösung.

utf8_decode(chr(10))

Ich habe versucht \n, <br/> und chr(10), aber nichts hat funktioniert. Dann merkte ich, dass es utf-8 war und probierte gerade den obigen aus. Es funktioniert gut mit MultiCell, aber nicht mit 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);

Sie können MultiCell so konfigurieren, dass HTML auf einer einfachen Ebene gelesen wird.

2
dummy

Die Lösung, die ich gefunden habe, war:

$text = 'Line one\n\nLine two');
$text = explode('\n', $text);

foreach ($text as $txt){
    $pdf->Write($txt);
    $pdf->Ln();
}

Auf diese Weise können Sie eine beliebige Anzahl von\n an einer beliebigen Position haben. Wenn Sie diesen Text dinamisch aus der Datenbank erhalten, werden die Zeilen korrekt unterbrochen.

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

In jeder Spalte, bevor Sie die X-Position festlegen, geben Sie zuerst die Y-Position an, also wurde es so

Spalte 1

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

Spalte 2

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

Ich hoffe es hilft..

1
zeus2026

Oder versuchen Sie dies einfach nach jeder Textpassage für eine neue Zeile.

$pdf->Write(0, ' ', '*', 0, 'C', TRUE, 0, false, false, 0) ;

0
raf_qpsk

Andere Lösungen (arbeitet mit TCPDF)

Verwenden Sie HEREDOC für eine lange Zeichenfolge. HERDOC beispielsweise für ein CONST verwenden (andere Sprachen definieren) 

$_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);

funktioniert bei mir wery gut ....

0
Ja Loc

Vielleicht ist es zu spät, aber ich habe dieses Problem auf sehr einfache Weise gelöst. Ich benutze die Multicell-Option und der Text kommt aus einem Formular. Wenn ich ein Eingabefeld verwende, um den Text zu erhalten, kann ich keine Zeile einfügen Bricht in irgendeiner Weise, aber wenn Sie ein Textfeld verwenden, sind die Zeilenumbrüche im Textbereich Zeilenumbrüche in der Multizelle ... und das ist es auch, wenn ich die Option utf8_encode($text) verwende, um Akzente zu erhalten

0
Felipe