使用Graph生成Laravel PDF并使用电子邮件发送

时间:2017-01-13 11:14:12

标签: laravel pdf-generation schedule chart.js

我试图在StackOverflow上找到它,并试图谷歌它,但找不到任何相关的答案。

我想使用包含图表/图表的PDF向Laravel应用程序的用户发送月度报告。

这就是已经完成的事情

  1. 创建路线,让我们说

    Route::get('/print/', 'PrintController@report');
    
  2. 在printController中创建了一个报表函数,它从数据库中获取所有必要的数据并返回一个包含用户数据的视图

    return view::make('monthly_report', $user_data);
    
  3. 在monthly_report视图中,获取所有用户数据,显示视图并使用数据创建图表。该图表是使用Charts.js创建的。它在画布上。

  4. 使用Ajax将生成的图表作为图像发送到服务器。例如

    var canvas = document.getElementById("myChart"), // Get your canvas
    imgdata = canvas.toDataURL();
    file_name = "<?php echo $chart_file_name; ?>"; //created with userId and date
    //send it to server
     $.ajax({
      method: "POST",
      url: "save",
      data: { 
      data: imgdata,
      file_name: file_name,
      _token: token, 
     } 
    });
    
  5. 创建了保存路径

    Route::post('print/save', 'PrintController@saveChart');
    
  6. 在打印控制器中,saveChart功能,保存图表

    $data = base64_decode($data);
    //save chart on server
    file_put_contents("Charts/".$fileName, $data);
    
  7. 然后使用另一个视图monthly_report2创建PDF报告,该视图也在saveChart函数中。视图monthly_report2不使用任何JavaScript,并使用month_report生成的图表图像,编号为6.

    $pdf = \PDF::loadView('monthly_report2', $cll_data);
    file_put_contents("reports/".$pdf_name, $pdf->output());
    
  8. 将生成的PDF保存在服务器上。到目前为止一切都很好。

    要通过电子邮件将这些PDF报告发送给用户,我将创建一个计划/粉修作业,该作业将在每月的特定日期运行,并将发送带有PDF报告作为附件的电子邮件。

    为了清楚起见,我会跳过一些细节,如果您需要更多信息,请询问。

    感谢您阅读到目前为止,现在我有两个问题

    1. 我的工作方式是好还是可以改进?

    2. 我们自动希望所有这一过程(生成报告并通过电子邮件发送)。要生成PDF,必须加载monthly_report视图?这样它就可以生成图表并将其发送到服务器。我们也可以安排它,以便自动生成pdf报告吗?如果没有,还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

有点大问题,但我会尝试回答

  1. 我认为这很好。我不是使用JavaScript创建图表的忠实粉丝,但这就是我。你显然知道你正在做什么,PDF生成是我的经验中的一个&#34;如果它有效,请不要打破它&#34;功能。

  2. 我认为这可能会更困难。由于您使用JavaScript创建图表,因此您需要某种引擎(想到NodeJS)来解析JavaScript并实际创建图表而无需打开浏览器并手动执行。 (这就是我不喜欢用JavaScript创建图表的原因)。您可以查看this one等教程,了解如何在服务器上呈现图表。

    之后,您可以查看Laravel task scheduler(如果你在Laravel 5上,Laravel 4存在community package)。您可以安排执行现有和自定义命令。在伪代码中,PDF生成命令可能如下所示:

    public function createAndSendCharts() {
    
        // 1. Get necessary user data
        // 2. Create your charts
        // 3. Save your charts
        // 4. Create email with charts
        // 5. Send your email
    
    } 
    

    然后,您可以将该功能添加到任务计划程序

    $schedule->command('send:charts')
             ->monthly();
    
  3. 希望这有一些帮助。总而言之,您做得很好,但如果您希望自动化整个过程,ChartJS的选择会产生一些影响。没有什么特别的,这种情况下存在大量的教程:)