签名板和dompdf

Signature pad and dompdf

本文关键字:dompdf      更新时间:2023-09-26

我使用Thomas J Bradley的插件在html表单的底部绘制两个签名,然后使用dompdf将其转换为pdf,并使用sendmail通过电子邮件作为附件发送。

一切都很好,除了我似乎无法在不将签名保存到磁盘的情况下将其重新绘制到pdf文件上,这是我想避免的。

Mr。Bradley提供了几种重新生成签名的方法,但我需要一些关于如何将签名数据和表单值一起传递到pdf转换器的建议,最好是"动态"(而不将数据保存到磁盘或数据库)。

如果有任何答案,我将不胜感激。如果您需要任何示例代码,请告诉我。

提前谢谢!

与其重新生成签名,不如捕获签名图像。Signature Pad可以将签名作为编码为数据URI的图像返回。dompdf了解数据URI,因此您可以使用它来生成PDF。如果你的目标平台不支持这种方法,那么作者有很多转换签名服务器端的选项。

简而言之,这个过程是在表单提交时捕获图像输出,将其传递给服务器,并用签名动态填充HTML以生成PDF。无需保存图像。

我没有使用Signature Pad,所以我使用作者的HTML模板作为示例代码的基础。

客户端

<form method="post" action="" class="sigPad">
  <label for="name">Print your name</label>
  <input type="text" name="name" id="name" class="name">
  <p class="typeItDesc">Review your signature</p>
  <p class="drawItDesc">Draw your signature</p>
  <ul class="sigNav">
    <li class="typeIt"><a href="#type-it" class="current">Type It</a></li>
    <li class="drawIt"><a href="#draw-it">Draw It</a></li>
    <li class="clearButton"><a href="#clear">Clear</a></li>
  </ul>
  <div class="sig sigWrapper">
    <div class="typed"></div>
    <canvas class="pad" width="198" height="55"></canvas>
    <input type="hidden" name="output" class="output">
    <input type="hidden" name="imgOutput" class="imgOutput">
  </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 ) {
    $( '.imgOutput' ).val( sig.getSignatureImage( ) );
  } );
</script>

服务器端

<?php
$img_output = $_POST['imgOutput'];
if ( base64_encode( base64_decode( $img_output ) ) === $img_output ) {
  require_oncde 'dompdf_config.inc.php';
  $html = '<p>Your Signature:</p><p><img src="' . $img_output . '"></p>';
  $dompdf = new DOMPDF;
  $dompdf->load_html( $html );
  $dompdf->render( );
  $dompdf->stream( );
} else {
  // exception logic ... "your signature was not valid"
}
?>

如何检查字符串是否为base64有效

p>Brian,你太棒了!我必须执行以下操作才能使其工作,因为我们正在检查这一行是否包含data:image/png;base64,

但在你的帮助和周围的一些挖掘下,我获得了一份pdf,上面有签名:)这是一个代码,以备将来有人需要。

html部分:

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="jquery.signaturepad.css" media="screen">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.signaturepad.min.js"></script>
</head>
<body>
<form method="post" action="pdf.php" class="sigPad">
  <label for="name">Print your name</label>
  <input type="text" name="name" id="name" class="name">
  <p class="drawItDesc">Draw your signature</p>
  <ul class="sigNav">
    <li class="drawIt"><a href="#draw-it">Draw It</a></li>
    <li class="clearButton"><a href="#clear">Clear</a></li>
  </ul>
  <div class="sig sigWrapper">
    <canvas class="pad" width="198" height="55"></canvas>
    
    <input type="hidden" name="imgOutput" class="imgOutput">
  </div>
  <button type="submit">I accept the terms of this agreement.</button>
</form>
<script>
    var sig;
  $(document).ready(function() {
    /*sig = $('.sigPad').signaturePad();*/
    sig = $('.sigPad').signaturePad({drawOnly:true});
  });
  $('.sigPad').submit(function(evt) {
    $('.imgOutput').val( sig.getSignatureImage() );
  });  
</script>
</body>
</html>

pdf.php:

<?php
if(isset($_POST['imgOutput'])){$img_output = $_POST['imgOutput'];}
$bse = preg_replace('#^data:image/[^;]+;base64,#', '', $img_output );
if ( base64_encode( base64_decode($bse) ) === $bse ) {
  require_once 'dompdf/dompdf_config.inc.php';
  $html = '<!DOCTYPE html><html><head></head><body><p>Your signature:</p>
  <br />
  <img src="'. $img_output .'"></body></html>';
  $dompdf = new DOMPDF;
  $dompdf->load_html($html);
  $dompdf->render();
  $dompdf->stream("test.pdf");
} 
else {
    echo ("ERROR !");
}
?>

非常感谢@Thomas J Bradley、dompdf团队和@BrianS,他们拯救了这一天。