1

fPDFでPDFを生成しています。

MultiCell内の長いテキストを取り消し線で消す必要があります。テキストは左右に揃えられており、これがおそらく問題の原因です。

これが私のコードです:

//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);

問題は、マルチセル内のテキストが正当化される(そして正当化される必要がある)ため、前の行のspacecがGetStringWidthが想定するよりも広いため、GetStringWidthがこのテキストの全幅を過小評価することです。

その結果、最後の行は、たとえば70%でストロークされ、その末尾の一部の文字はストロークされません。

マルチセルの最後の行の幅を計算する方法はありますか?

4

2 に答える 2

3

私は自分で解決策を見つけました。不必要な質問をしてすみません。

これが私がしたことです:

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;
    }    
}

これが誰かを助けたことを願っています:)

于 2010-05-14T09:09:53.040 に答える
0

前の行のspacecは、GetStringWidthが想定している幅よりも広いため、GetStringWidthはこのテキストの全幅を過小評価しています。

スペースを数えて、不足している幅を自分で追加しようとしましたか。すべてのスペースの幅は5ピクセルであると想定されていますが、fpdfでは4ピクセルと推定されます。おそらく、スペースごとに1ピクセルを合計幅に追加できます。

于 2010-05-14T09:13:50.217 に答える