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

Laravel PDF generation with Graph and send it with Email

我试图在 Whosebug 上找到它,也试图 google 它,但找不到任何相关答案。

我想用包含 graph/chart.

的 PDF 向 Laravel 应用程序的用户发送月度报告

这是已经完成的

  1. 创建了一条路线,比方说

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

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

  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,而是使用由 monthly_report 生成的图表图像,在编号 6 中。

    $pdf = \PDF::loadView('monthly_report2', $cll_data);
    file_put_contents("reports/".$pdf_name, $pdf->output());
    

它将生成的 PDF 保存在服务器上。到目前为止一切顺利。

为了通过电子邮件将这些 PDF 报告发送给用户,我将创建一个 schedule/crone 工作,该工作将在每月的特定日期 运行 发送电子邮件PDF 报告作为附件。

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

感谢大家的阅读,现在我有两个问题

  1. 我这样做的方式好还是可以改进?

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

有点大问题,但我会尽力回答

  1. 我觉得还不错。我不太喜欢使用 JavaScript 创建图表,但我就是这样。您显然知道自己在做什么,根据我的经验,PDF 生成是一项 "If it works, please don't break it" 功能。

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

    之后,您可以查看 Laravel task scheduler (provided you're on Laravel 5, a community package 是否存在 Laravel 4)。您可以安排要执行的现有命令和 custom-made 命令。在 pseudo-code 中,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();
    

希望这对您有所帮助。总而言之,你做的很好,但如果你想自动化整个过程,选择 ChartJS 会产生一些后果。没什么特别的,针对这种情况存在大量教程 :)