fPDF:如何在多单元格中删除/删除合理的文本?

时间:2010-05-14 08:30:42

标签: php fpdf strikethrough

我正在使用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%,并且结尾处的一些字母没有被描出来。

如何计算多单元格中最后一行的宽度?

2 个答案:

答案 0 :(得分: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;
    }    
}

希望这有助于某人:)

答案 1 :(得分:0)

  

前一行中的spacec更宽   比GetStringWidth假定的那样   GetStringWidth低估了全部   本文的宽度。

您是否尝试过计算空间并自行添加缺失的宽度。假设每个空间应该是5px宽,但是fpdf估计它是4px,也许你可以在每个空间加上1px到最后的总宽度。