function KeepSamePage($text)
{
$sb_w = $oPdf->GetStringWidth($text);
$num_lines = explode("\n",$text);
$total = 0;
foreach($num_lines as $line)
{
$y = $oPdf->GetY();
$page_height = 11 * 25.4;
$this_width = $oPdf->GetStringWidth(strip_tags($line));
$extra_line = floor($this_width / $w);
$is_line = $this_width / ($w - 1);
$is_line = $this_width == 0 ? 1 + $extra_line : ceil($is_line) + $extra_line;
$total = $total + $is_line;
}
$sb_height = $total * 5;
if(($page_height - $y) < $sb_height){ $oPdf->AddPage(); }
}
KeepSamePage($signature_block);
我正在使用 FPDF,我正在创建一个函数来将一封信的签名页全部放在同一页上。这将检查它是否会转到下一页,如果是,则执行 AddPage();
我遇到的问题是,当我在函数中没有它时,它可以完美运行,但是当我将它放在函数中时,在调用由 $oPdf 表示的类中的方法时会出错。
所以,我的问题通常是这样的:是否可以让 PHP 中的常规函数调用类方法,如下所示?如果有可能,我做错了什么?
产生的错误是:
Fatal error: Call to a member function GetStringWidth() on a non-object in /home/jarodmo/public_html/cms/attorney_signature_block.php on line 18
哦,还有对我的功能的解释,以防你感兴趣或其他人发现它。
文本中有 \n 用于换行,因此 PDF 会将签名块的文本放在下一行。每个新的数组元素都应该是一个新行,因此我需要将行数乘以行高,在这种情况下为 5。(见 $total * 5)。
我检查我们在页面上的位置,找到页面高度和 Y 位置之间的差异,然后检查签名块的高度。如果签名块更大,那么它将不适合,我知道我们需要手动分页符。
另外,因为我使用 \n 进行分解以查看行,所以我还必须检查以确保没有任何行仍然比页面宽,否则它会自动换行并且实际上是 2 行(或更多),其中我只是把它算作 1,因为它只是一个数组元素。我知道签名块不应该有足够宽的文本,不能放在 2 行上,但我写这个是为了不仅仅适用于签名块。我希望能够在任何我想确保某些文本保持在同一页面上的任何地方调用此函数。调用该函数,检查我将要写入 PDF 的文本,然后继续了解所需的文本都在同一页面上。
感谢所有的帮助和评论。SO是最好的。