如何在PHP/CodeIgniter中使用MPDF生成多份PDF并打包为Zip下载
在CodeIgniter中用MPDF生成多份PDF并打包Zip下载的正确实现
现有代码的核心问题
- 错误地将HTML模板内容而非生成的PDF二进制数据添加到了Zip包中
- 调用
Output('xxx.pdf', 'F')仅将PDF保存到服务器,但后续未读取该文件,反而直接使用了HTML变量
修正方案(推荐:直接获取PDF二进制内容,减少IO操作)
无需先将PDF保存到服务器,直接获取MPDF生成的二进制内容并添加到Zip:
// 加载CodeIgniter的Zip类 $this->load->library('zip'); // 循环处理每个订单(示例逻辑,根据实际业务调整) foreach ($orders as $order) { // 加载视图生成PDF对应的HTML内容 $html = $this->load->view('download_invoice', $finalAr, true); // 初始化MPDF实例,指定临时目录 $mpdf = new \Mpdf\Mpdf(['tempDir' => __DIR__ . '/../../tmp']); $mpdf->debug = true; $mpdf->WriteHTML($html); // 使用'S'参数获取PDF的二进制字符串内容(不保存到文件) $pdfBinaryContent = $mpdf->Output('Invoice_' . $order['orderId'] . '.pdf', 'S'); // 将PDF二进制数据添加到Zip包 $this->zip->add_data('Invoice_' . $order['orderId'] . '.pdf', $pdfBinaryContent); } // 生成Zip包并触发浏览器下载 $this->zip->download('invoices_backup.zip');
备选方案(需保留服务器上的PDF文件)
如果需要在服务器留存生成的PDF文件,可先保存再读取内容添加到Zip:
$this->load->library('zip'); $tempSaveDir = __DIR__ . '/../../tmp/'; // 确保目录存在且有写入权限 if (!is_dir($tempSaveDir)) { mkdir($tempSaveDir, 0755, true); } foreach ($orders as $order) { $html = $this->load->view('download_invoice', $finalAr, true); $mpdf = new \Mpdf\Mpdf(['tempDir' => $tempSaveDir]); $mpdf->debug = true; $mpdf->WriteHTML($html); $pdfFilename = 'Invoice_' . $order['orderId'] . '.pdf'; $fullSavePath = $tempSaveDir . $pdfFilename; // 将PDF保存到服务器临时目录 $mpdf->Output($fullSavePath, 'F'); // 读取生成的PDF文件并添加到Zip if (file_exists($fullSavePath)) { $this->zip->add_data($pdfFilename, file_get_contents($fullSavePath)); // 可选:删除临时PDF文件,节省服务器空间 unlink($fullSavePath); } } $this->zip->download('invoices_backup.zip');
注意事项
- 确保MPDF的
tempDir及临时文件保存目录拥有写入权限,否则会生成PDF失败 - 若处理大量或大体积PDF,需调整PHP的
memory_limit配置,避免内存溢出 - CodeIgniter的Zip类会自动处理二进制内容的编码,无需额外转换
内容的提问来源于stack exchange,提问作者Meenakshi Dasondhi
相关产品推荐
相关产品推荐

