Laravel-从表单生成PDF,还包括用户签名

时间:2018-11-23 10:32:52

标签: laravel forms dompdf mpdf signaturepad

我对自己的水平有很大的挑战。

标题是不言自明的:使用Laravel从表单(包括用户的签名)中生成PDF。

My laravel and general php level is basic。我知道如何在laravel上建立一个基本博客(就像所有关注laracast或类似的家伙一样),但是我发现这很艰难,因为我发现同时有许多来自不同地方的概念,并且我还有很多空白知识。

至少知道哪些软件包是执行所有这些操作的最佳软件包,这至少对您很有帮助。我一直在尝试使用DOMPDF和https://github.com/szimek/signature_pad。但是我已经读过DOMPDF,我不能使用活动表单...我还检查了MPDF。

我主要需要的是视图,其中有一个表单,在该表单后有一个供用户签名的签名板,提交后会生成pdf。 / p>

关于阅读,学习和关注什么的任何起点?

在我看来,如何将签名的图像(该脚本在js上)与表单数据混合在一起似乎是珠穆朗玛峰。

我也无法想象是如何处理不同的控制器的。.

1 个答案:

答案 0 :(得分:2)

拒绝接受您缺乏自行执行此操作的知识。提出这个要求并不令人感到羞耻,我想它毕竟会让您的生活更加轻松。

我的建议是将整个任务分解为您能够处理的适当子任务。我认为是:

  1. 创建可以提交的绝对普通的HTML表单。
    为此,您将需要一个具有两个功能的控制器。表单提交后,一个函数将显示该表单,另一函数将处理提交的数据。

    class MyFormController
    {
        public function getForm()
        {
            return view('my.form');
        }
    
        public function postForm(Request $request)
        {
            // do something with the form data in $request
        }
    }
    

    我想你知道如何组合正确的HTML表单。

  2. 使用提交的表单数据生成PDF。
    Laravel的大多数pdf生成器软件包的工作方式是使用刀片模板视图。对您来说,这实际上是非常有益的,因为您已经知道如何组合HTML视图!

    因此,如果我们将其翻译成基于barryvdh/laravel-dompdf包的代码,则会得到如下信息:

    public function postForm(Request $request)
    {
        $pdf = PDF::loadView('my.pdf', [
            'name' => $request->input('name'),
            'address' => $request->input('address'),
            // ... and more data if you like
        ]);
    
        return $pdf->download('signed_form.pdf');
    }
    

    当然,我们还将需要一个刀片模板。根据名称,它将具有路径和文件名resources/views/my/pdf.blade.php

    <table>
      <tr>
        <th>Name:</th>
        <td>{{ $name }}</td>
      </tr>
      <tr>
        <th>Address:</th>
        <td>{{ $address }}</td>
      </tr>
    </table>
    
  3. 现在,由于我们具有表单和PDF生成本身,因此我们可以继续进行签名。
    公平地讲,到目前为止,我从未做过类似的事情。但是经过快速搜索之后,我发现了JavaScript软件包szimek/signature_pad,它看起来非常有前途。我认为设置非常容易解释,但是到目前为止,这是我所了解的:

    • 将文档中提供的脚本标记(<script src="...">)添加到表单视图中。
    • 将隐藏的输入字段添加到表单(<input type="hidden" name="sig" id="sig">)。
    • 向表单视图添加<canvas> HTML元素。给它一个标识符:<canvas id="signature">
    • 添加另一个脚本标签,但自定义JavaScript代码位于已添加的脚本标签下方。像这样:

      <script type="text/javascript">
          var canvas = document.getElementById('signature');
          var signaturePad = new SignaturePad(canvas);
      
          function onFormSubmit()
          {
              document.getElementById('sig').value = signaturePad.toDataURL();
          }
      </script>
      
    • 您现在还必须将onsubmit="onFormSubmit()"添加到您的<form ...>标记中。该脚本的作用是首先初始化签名板,然后将隐藏的输入字段的值设置为签名板的内容。

    • 您最后要做的是将提交的sig值添加到用于生成pdf的视图中。并且在视图本身中,您必须在新的图像元素中使用提交的sig数据:<img src="{{ $sig }}">

如果幸运的话,我刚刚写的所有内容(无需任何测试)都可以立即使用。如果没有,您至少应该知道实现目标的步骤。

顺便说一句,您当然可以使所有视图看起来精美。但是请注意,PDF无法显示与HTML一样多的信息。因此,当您将视图转换为pdf时,您肯定会在某些时候丢失信息和样式。