0

我是新手,如果我的问题很愚蠢,请原谅。我的问题是当我尝试使用此处的说明进行多个签名时:https ://github.com/thomasjbradley/signature-pad/blob/master/examples/accept-multiple-signatures.html

当我将“sigPad”类从 Form 标签移动到 Div 标签(如链接中的示例中)时,domPDF 创建不起作用。“找不到图像”。

因此,为了将我的问题归结为本质,我将其缩小到这个问题。如果我将类“sigPad”移动到 div,为什么表单不能与我的 domPDF 脚本一起使用。

另外,我有什么办法可以解决这个问题吗?我有一个现在可以与 dompdf 一起使用的大型表单,我想为其添加几个签名。我宁愿没有表单标签中的类。

这是一个没有多个签名的示例,只是试图将 sigPad 类移动到 div 而不是表单中。如果它在 Form 标签中它可以工作,如果它在像这样的 div 标签中它不会:

签名.PHP

<form method="post" action="pdf.php">
<div class="sigPad">
<canvas class="pad" width="198" height="55"></canvas>
<input type="hidden" name="output" class="output" />
</div>
<button type="submit">I accept the terms of this agreement.</button>
</form>
<script>
var sig;
$( document ).ready( function ( ) {
sig = $('.sigPad').signaturePad();
} );
$( '.sigPad' ).submit( function ( evt ) {
$( '.output' ).val( sig.getSignatureImage( ) );
} );  
</script>

PDF.PHP

<?php
if(isset($_POST['output'])){$output = $_POST['output'];}
require_once '/dompdf/dompdf_config.inc.php';
$html = '<!DOCTYPE html><html><head></head><body><p>Your signature:</p><br /><img src="'. $output .'"></body></html>';
$dompdf = new DOMPDF;
$dompdf->load_html( $html );
$dompdf->render( );
$dompdf->stream("test.pdf");
?>

任何帮助将不胜感激。谢谢你!

4

1 回答 1

0

当您将.sigPad类从 FORM 元素移动到 DIV 元素时,您不再拥有submit()可以触发的事件。此事件仅适用于 FORM 元素。由于未触发此事件,因此不会将签名图像数据复制到您的 INPUT 元素中。

尝试对您的示例进行以下更新:

HTML

<form method="post" action="pdf.php">
  <div class="sigPad">
    <canvas class="pad" width="198" height="55"></canvas>
    <input type="hidden" name="output1" class="output" />
  </div>
  <div class="sigPad">
    <canvas class="pad" width="198" height="55"></canvas>
    <input type="hidden" name="output2" class="output" />
  </div>
  <button type="submit">I accept the terms of this agreement.</button>
</form>

JavaScript

<script>
  $( document ).ready( function ( ) {
    $('.sigPad').signaturePad( );
  } );
  $( 'form' ).submit( function ( evt ) {
    $( '.sigPad' ).each( function ( idx , el ) {
      $( this ).find( '.output' ).val( $( this ).signaturePad( ).getSignatureImage( ) );
    } );
  } );  
</script>

更新后的 JavaScript 并不完美,可能会让您有些困惑,但它足够灵活,可以处理任意数量的签名字段。发生的事情是,当表单提交时,文档被解析为签名板容器。然后该each()构造用于将input.output元素的值设置为签名板的值。

PHP

<?php
require_once '/dompdf/dompdf_config.inc.php';
$output1 = ( !empty( $_POST['output1'] ) ? $_POST['output1'] : 'http://placekitten.com/300/100' );
$output2 = ( !empty( $_POST['output2'] ) ? $_POST['output2'] : 'http://placekitten.com/300/100' );
$html = '
  <!DOCTYPE html>
  <html>
  <head></head>
  <body>
    <p>Signature 1:</p><br /><img src="'. $output1 .'">
    <p>Signature 2:</p><br /><img src="'. $output2 .'">
  </body>
  </html>
';
$dompdf = new DOMPDF;
$dompdf->load_html( $html );
$dompdf->render( );
$dompdf->stream("test.pdf");
?>

我喜欢用三元运算符来初始化变量,但我很邪恶。此外,我们应该始终注意对来自客户端的数据进行额外验证。因此,我可能会增强 PHP 以至少查看 base64 数据是否实际上是 base64(而不是 HTML 片段)。

$output1 = (!empty( $_POST['output1'] ) && base64_encode( base64_decode( $_POST['output1'] ) ) === $_POST['output1']) ? $_POST['output1'] : 'http://placekitten.com/300/100';

你甚至可以更进一步,检查它是否真的是一张图片。但我会把它留给你作为练习。

于 2014-05-06T22:20:32.243 回答