问题描述
我正在使用FPDF的Java端口.我正在遇到禽类错误.
1).当我每次打印在新线路上时,我都会称呼多电3次.
MultiCell(0, 1, "abcd", currentBorders, Alignment.LEFT, false); //prints on one line MultiCell(0, 1, "efg", currentBorders, Alignment.LEFT, false); //prints on next line
我希望在拨打Multicell的电话后没有线路休息.我该怎么做?
2)如果我做以下操作,那么我的字符串的某些部分将在一行上打印出来.
MultiCell(getStringWidth(myString), 1, myStringcurrentBorders, Alignment.LEFT, false);
3)如果我做以下操作,则在打印mystring的行之后有许多空白行.如果我使用一个1 ans第二参数
,它可以正常工作MultiCell(0, myFontSize, "123456", currentBorders, Alignment.LEFT, false);
有什么问题?
推荐答案
我在编写MultiCell之前将获得当前的Y位置,然后将"光标"移回MultiCell>生成后的Y位置.这样:
$current_y = $pdf->GetY(); $current_x = $pdf->GetX(); $cell_width = 50; MultiCell($cell_width, 1, "abcd", currentBorders, Alignment.LEFT, false); $pdf->SetXY($current_x + $cell_width, $current_y); $current_x = $pdf->GetX(); MultiCell($cell_width, 1, "abcd", currentBorders, Alignment.LEFT, false);
这样的东西.
其他推荐答案
我创建了一种称为MultiAlignCell的新方法.它采用与 MultiCell 相同的参数来自 Cell .您可以将其添加到扩展的FPDF类中.
/** * MultiCell with alignment as in Cell. * @param float $w * @param float $h * @param string $text * @param mixed $border * @param int $ln * @param string $align * @param boolean $fill */ private function MultiAlignCell($w,$h,$text,$border=0,$ln=0,$align='L',$fill=false) { // Store reset values for (x,y) positions $x = $this->GetX() + $w; $y = $this->GetY(); // Make a call to FPDF's MultiCell $this->MultiCell($w,$h,$text,$border,$align,$fill); // Reset the line position to the right, like in Cell if( $ln==0 ) { $this->SetXY($x,$y); } }
其他推荐答案
我修改了多切尔方法,它作为上述答案起作用,您可以以与单元格方法相同的方式使用该方法.
function MultiCell($w, $h, $txt, $border=0, $ln=0, $align='J', $fill=false) { // Custom Tomaz Ahlin if($ln == 0) { $current_y = $this->GetY(); $current_x = $this->GetX(); } // Output text with automatic or explicit line breaks $cw = &$this->CurrentFont['cw']; if($w==0) $w = $this->w-$this->rMargin-$this->x; $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; $s = str_replace("\r",'',$txt); $nb = strlen($s); if($nb>0 && $s[$nb-1]=="\n") $nb--; $b = 0; if($border) { if($border==1) { $border = 'LTRB'; $b = 'LRT'; $b2 = 'LR'; } else { $b2 = ''; if(strpos($border,'L')!==false) $b2 .= 'L'; if(strpos($border,'R')!==false) $b2 .= 'R'; $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2; } } $sep = -1; $i = 0; $j = 0; $l = 0; $ns = 0; $nl = 1; while($i<$nb) { // Get next character $c = $s[$i]; if($c=="\n") { // Explicit line break if($this->ws>0) { $this->ws = 0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); $i++; $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if($border && $nl==2) $b = $b2; continue; } if($c==' ') { $sep = $i; $ls = $l; $ns++; } $l += $cw[$c]; if($l>$wmax) { // Automatic line break if($sep==-1) { if($i==$j) $i++; if($this->ws>0) { $this->ws = 0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); } else { if($align=='J') { $this->ws = ($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); } $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); $i = $sep+1; } $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if($border && $nl==2) $b = $b2; } else $i++; } // Last chunk if($this->ws>0) { $this->ws = 0; $this->_out('0 Tw'); } if($border && strpos($border,'B')!==false) $b .= 'B'; $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); $this->x = $this->lMargin; // Custom Tomaz Ahlin if($ln == 0) { $this->SetXY($current_x + $w, $current_y); } }
问题描述
I am using java port of fpdf. I am encountering fowwlowing errors.
1).When i call multicell 2 times every time the text is printed on a new line.
MultiCell(0, 1, "abcd", currentBorders, Alignment.LEFT, false); //prints on one line MultiCell(0, 1, "efg", currentBorders, Alignment.LEFT, false); //prints on next line
I want that there is no line break after the call to multicell. How can i do it?
2)If i do the following thing then some part of my string gets printed on one line and some on next.
MultiCell(getStringWidth(myString), 1, myStringcurrentBorders, Alignment.LEFT, false);
3)If i do the following thing then there are many blank lines after the line on which myString is printed. It works correctly if i use one 1 ans second parameter
MultiCell(0, myFontSize, "123456", currentBorders, Alignment.LEFT, false);
What is the problem?
推荐答案
I would get the current Y position before writing the MultiCell and then move the "cursor" back to that Y position after the MultiCell generation. Like this:
$current_y = $pdf->GetY(); $current_x = $pdf->GetX(); $cell_width = 50; MultiCell($cell_width, 1, "abcd", currentBorders, Alignment.LEFT, false); $pdf->SetXY($current_x + $cell_width, $current_y); $current_x = $pdf->GetX(); MultiCell($cell_width, 1, "abcd", currentBorders, Alignment.LEFT, false);
Something like that.
其他推荐答案
I created a new method called MultiAlignCell. It takes the same parameters as MultiCell but with the added ln field from Cell. You can add it to your extended FPDF class.
/** * MultiCell with alignment as in Cell. * @param float $w * @param float $h * @param string $text * @param mixed $border * @param int $ln * @param string $align * @param boolean $fill */ private function MultiAlignCell($w,$h,$text,$border=0,$ln=0,$align='L',$fill=false) { // Store reset values for (x,y) positions $x = $this->GetX() + $w; $y = $this->GetY(); // Make a call to FPDF's MultiCell $this->MultiCell($w,$h,$text,$border,$align,$fill); // Reset the line position to the right, like in Cell if( $ln==0 ) { $this->SetXY($x,$y); } }
其他推荐答案
I have modified the MultiCell method, it works as the above answer, and you can use the method in the same way as the Cell method.
function MultiCell($w, $h, $txt, $border=0, $ln=0, $align='J', $fill=false) { // Custom Tomaz Ahlin if($ln == 0) { $current_y = $this->GetY(); $current_x = $this->GetX(); } // Output text with automatic or explicit line breaks $cw = &$this->CurrentFont['cw']; if($w==0) $w = $this->w-$this->rMargin-$this->x; $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; $s = str_replace("\r",'',$txt); $nb = strlen($s); if($nb>0 && $s[$nb-1]=="\n") $nb--; $b = 0; if($border) { if($border==1) { $border = 'LTRB'; $b = 'LRT'; $b2 = 'LR'; } else { $b2 = ''; if(strpos($border,'L')!==false) $b2 .= 'L'; if(strpos($border,'R')!==false) $b2 .= 'R'; $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2; } } $sep = -1; $i = 0; $j = 0; $l = 0; $ns = 0; $nl = 1; while($i<$nb) { // Get next character $c = $s[$i]; if($c=="\n") { // Explicit line break if($this->ws>0) { $this->ws = 0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); $i++; $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if($border && $nl==2) $b = $b2; continue; } if($c==' ') { $sep = $i; $ls = $l; $ns++; } $l += $cw[$c]; if($l>$wmax) { // Automatic line break if($sep==-1) { if($i==$j) $i++; if($this->ws>0) { $this->ws = 0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); } else { if($align=='J') { $this->ws = ($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); } $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); $i = $sep+1; } $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if($border && $nl==2) $b = $b2; } else $i++; } // Last chunk if($this->ws>0) { $this->ws = 0; $this->_out('0 Tw'); } if($border && strpos($border,'B')!==false) $b .= 'B'; $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); $this->x = $this->lMargin; // Custom Tomaz Ahlin if($ln == 0) { $this->SetXY($current_x + $w, $current_y); } }