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最高です。