在开发一个基于 WordPress 的 CRM system的时候,有一个需求是根据用户提供的信息,生成一个 PDF 文件,并通过电子邮件发送给客户。没有做过的朋友可能会认为这是一个比较麻烦的需求,其实我们把这个需求拆分开来做,就很简单了,首先,获取用户信息,然后使用用户信息生成 PDF 文件,最后再把生成的 PDF 文件通过 Email 发送给客户就可以了 。
knp-snappy
是一个可以帮助我们从 URL 或 HTML 文件生成 PDF 的 PHP 库,该库依赖 wkhtmltopdf,如果操作系统中没有安装,按照前面网址中的说明安装即可。安装后,我们通过 Composer 安装,然后再包含 Composer 生成的自动加载文件到主题或插件中。
composer require knplabs/knp-snappy
使用 knp-snappy 生成 PDF 文件
首先,我们需要指定生成的 PDF 文件保存的位置,然后指定用来生成 URL 文件的 HTML 文件或字符串。有了这两个信息,调用 knp-snappy 的对应方法就可以生成 PDF 文件。
use Knp\Snappy\Pdf;
use Wenprise\Facades\View;
// 生成的 PDF 文件
$file = WP_CONTENT_DIR . '/pdf/register-' . $client->ID . '.pdf';
// 如果文件已存在,删除文件,重新生成
if (file_exists($file)) {
unlink($file);
}
// 用来生成 PDF 文件的 HTML 文件
$html = View::make($view)->with($data);
// 开始使用 knp-snappy 生成 PDF 文件
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
try {
$snappy->generateFromHtml($html, $file);
} catch (\Exception $e) {
}
上面代码中的 View 类是我们的 MVC 框架中的方法,你可以使用自己的函数替换,或者可以直接从 URL 中生成 PDF,具体使用方法请参考 knp-snappy 使用文档。
通过电子邮件发送生成的 PDF 文件
生成后的文件保存在我们在代码中指定的位置。生成 PDF 文件后,使用 WordPress 内置的 wp_mail 函数发送即可。获取用户电子邮件、设置邮件标题、内容的方法很简单,WordPress 官方也有介绍,这里就不多说了。
wp_mail($to, $subject, $message, $headers, [$file]);
请注意文件安全
为了防止 PDF 文件泄漏,我们需要采取一些安全措施,比如随机生成 PDF 文件名,通过 Ngnix 设置,禁止用户下载 PDF 文件,或者邮件发送后,直接删除 PDF 文件等等。