0
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是最好的。

4

3 回答 3

1
$oPdf 

未在您的代码中定义。您需要定义它,并且可能阅读PHP 变量范围。

您正在尝试访问函数中 $oPdf 对象的方法,但您的函数不知道 $oPdf 是什么,因此出现错误消息。

于 2013-03-02T03:50:07.390 回答
1

你必须做这样的事情。

function KeepSamePage($text) {
$oPdf = new your_string_class();
$sb_w = $oPdf->GetStringWidth($text);
}

或者

$oPdf = new your_string_class();
function KeepSamePage($text, $oPdf) {
$sb_w = $oPdf->GetStringWidth($text);
}
于 2013-03-02T03:57:36.893 回答
0

尝试以下操作:

function KeepSamePage($text) {
    global $oPdf;

    …
}

问题是,该对象是在您的函数之外定义的,您必须允许您的函数访问它。

// 编辑:如果你想避免全局,你将不得不将你的对象传递给函数,如下所示:

function KeepSamePage($text, $oPdf) {
    …
    // IMPORTANT! $oPdf has changed in this function, so you will have to give it back
    return $oPdf;
}

你可以这样调用你的函数:

$oPdf = KeepSamePage($signature_block, $oPdf);

优点是,您在主线程中看到,您的函数可能已经更改了对象。

// 编辑 2:我认为,在你的情况下,我在编辑 1 上错了。当您将完整的对象传递给函数时,每个更改都会应用于对象,因此更改将仍然存在而不会返回结果。如果这是在主线程中定义的变量,则必须返回新值:

$a = 1;

function result1($a) {
    ++$a;
}

function result2($a) {
    return ++$a;
}

echo $a."\n"; // 1
result1($a);
echo $a."\n"; // 1
$a = result2($a);
echo $a."\n"; // 2
于 2013-03-02T03:57:58.550 回答