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) を掛ける必要があります。($合計 * 5 を参照)。

ページのどこにいるかを確認し、ページの高さと Y 位置の差を見つけて、それを署名ブロックの高さと照合します。署名ブロックがこれよりも大きい場合は収まらず、手動で改ページする必要があることはわかっています。

また、行を確認するために \n を使用して分解するため、どの行もページより幅が広くないことを確認する必要があります。そうしないと、ワードラップが発生し、実際には 2 行 (またはそれ以上) になります。配列要素が 1 つだけだったので、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:あなたの場合はedit1が間違っていたと思います。オブジェクト全体を関数に渡すと、すべての変更がオブジェクトに適用されるため、結果を返さなくても変更は存在し続けます。これがメインスレッドで定義された変数である場合は、新しい値を返す必要があります。

$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 に答える