Frage

Ich erzeuge ein PDF mit FPDF.

Ich brauche einen langen Text in einem Multicell gestrichen. Der Text ist gerechtfertigt, nach links und rechts, was wahrscheinlich die Ursache des Problems ist.

Hier ist mein Code:

//get the starting x and y of the cell to strikeout
$strikeout_y_start = $pdf->GetY();
$strikeout_x = $pdf->getX();
$strikeText = "Some text with no New Lines (\n), which is wrapped automaticly, cause it is  very very very very very very very very very very long long long long long long long long long long long long long long long long long long"
//draw the text
$pdf->MultiCell(180, 4, $strikeText);
//get the y end of cell
$strikeout_y_end = $pdf->GetY();
$strikeout_y = $strikeout_y_start+2;
$strikeCount = 0;
for ($strikeout_y; $strikeout_y < $strikeout_y_end - 4; $strikeout_y+=4) {
    $strikeCount++;
    //strike out the full width of all lines but last one - works OK
    $pdf->Line($strikeout_x, $strikeout_y, $strikeout_x + 180, $strikeout_y);
}

//this works, but gives incorrect results
$width = $pdf->GetStringWidth($strikeText);
$width = $width - $strikeCount*180;
//the line below will strike out some text, but not all the letters of last line
$pdf->line($strikeout_x, $strikeout_y, $strikeout_x+$width, $strikeout_y);

Das Problem ist, dass der Text in Multizellen gerechtfertigt ist (und sein müssen), die SpaceC in früheren Linien sind breiter als die GetStringWidth annimmt, so GetStringWidth die volle Breite dieses Textes unterschätzt.

Als Ergebnis die letzte Zeile wird durchgestrichen in, sagen wir, 70%, und einige Buchstaben am Ende davon nicht gestreichelt werden.

Alle Ideen, wie die Breite der letzten Zeile berechnen in Multizellen?

War es hilfreich?

Lösung

fand ich die Lösung selbst. Es tut uns unnötige Fragen zu stellen.

Hier ist, was ich getan hatte:

class VeraPDF extends FPDF {

    /**
     * Returns width of the last line in a multicell
     * useful for strike out / strike through 
     * 
     *
     * @param string $s - the string measured
     * @param int $lineWidth - with of the cell/line
     * @return int
     */
    function GetStringWidth_JustifiedLastLineWidth($s, $lineWidth)
    {
        //Get width of a string in the current font
        $s=(string)$s;
        $words = split(' ',$s);
        $cw=&$this->CurrentFont['cw'];
        $w=0;
        $spaceWidth = $this->GetStringWidth(' ');

        for($i=0, $wordsCount = count($words); $i<$wordsCount; $i++){
            // sum up all the words width, and add space withs between the words
            $w += $this->GetStringWidth($words[$i]) + $spaceWidth;
            if ($w > $lineWidth) {
                //if current width is more than the line width, then the current word
                //will be moved to next line, we need to count it again
                $i--;
            }
            if ($w >= $lineWidth) {
                //if the current width is equal or grater than the line width, 
                //we need to reset current width, and count the width of remaining text
                $w = 0;
            }
        }
        //at last, we have only the width of the text that remain on the last line!
        return $w;
    }    
}

Hope this half jemand:)

Andere Tipps

  

die SpaceC in früheren Linien breite   als das GetStringWidth annimmt, so   GetStringWidth unterschätzt die volle   Breite dieses Textes.

Haben Sie versucht, die Räume zu zählen und die fehlende Breite selbst hinzufügen. Sagen Sie jeden Raum soll breit sein 5px, aber fpdf etimates es 4px sein, vielleicht könnte man hinzufügen 1px pro Raum zur Gesamtbreite am Ende.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top