2010-05-14 6 views
1

Я создаю PDF с помощью fPDF.fPDF: как вычеркнуть/зачеркнуть оправданный текст в многорежимном режиме?

Мне нужно прочертить длинный текст внутри 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); 

Проблема заключается в том, что, поскольку текст в MULTICELL оправдан (и должны быть), то пространствас в предыдущих строках шире, чем GetStringWidth предполагает, так GetStringWidth недооценивает полная ширина этого текста.

В результате последняя строка разглажена, скажем, на 70%, а некоторые буквы на конце ее не поглажены.

Любые идеи о том, как рассчитать ширину последней строки в многорежимном пространстве?

ответ

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

Надеется, что это помогает кто-то :)

+0

Извините, что ответил сам. У меня была идея, как решить эту проблему сразу после того, как я разместил здесь вопрос – SWilk

0

в пространствас в предыдущих строках шире чем GetStringWidth принимает на себя, так GetStringWidth занижает полный ширину этого текста.

Вы пытались подсчитать пробелы и добавить недостающую ширину самостоятельно. Скажем, что каждое пространство должно быть шириной 5 пикселей, но fpdf обозначает 4px, возможно, вы могли бы добавить 1px на пробел в общую ширину в конце.

+0

Спасибо за ответ. На самом деле fpdf подсчитывает ширину пространства, как определено в текущем шрифте. Но когда текст обернут и оправдан, пробелы «растут», чтобы занять пространство, обжаренное словом, которое было перенесено на следующую строку, когда линия была заполнена до конца. Я только что опубликовал решение этого вопроса, и оно основано на правиле, которое вам нужно считать дважды в двух словах, и полностью игнорировать полностью заполненные строки. – SWilk

 Смежные вопросы

  • Нет связанных вопросов^_^