我正在使用mPDF 库直接从 HTML 输出生成 PDF 文档。问题是这个 mPDF 库是按原样编写的,它会生成许多通知(未定义的索引、未定义的偏移量等)。我尝试了任何方法来停止输出它们,但没有任何帮助。
我尝试将我插入到我的 index.php 中的内容error_reporting(E_ALL ^ E_NOTICE);
以及error_reporting(E_ALL & ~E_NOTICE);
插入到直接包含 mpdf.php 的类和方法中以及在 mpdf.php 的开头。我还尝试了组合ini_set('display_errors', 0);
- 所有这些指令都适用于整个 Web 应用程序,但适用于 mpdf。因此,即使 PDF 格式正确且有效,我也无法输出它(让用户下载它)。
我的 HTML 也出现了问题(简单的表格,真的没什么特别的),而示例工作正常且没有任何通知。
所以我需要的帮助:要么摆脱通知,要么更好地帮助我找出为什么 mPDF 不适合我。
如果我使用此代码:
include_once(DIR_MPDF.'mpdf.php');
$mpdf = new mPDF();
$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);
$mpdf->WriteHTML('<table><tr><td>HELLO WORLD</td></tr></table>');
$mpdf->Output();
exit;
一切正常,但如果我尝试输出这个 HTML:
$mpdf->WriteHTML('<table><tr><td>HELLO WORLD</td><td>HELLO WORLD</td></tr></table>');
我收到通知,因此无法输出 PDF。
如果我将 mPDF 的输出保存到文件中(使用 eg file_put_contents()
),即使我使用复杂的 HTML,PDF 也是有效的,因此是可读的——但通知仍然会打印到浏览器中。无论如何,我需要提供 PDF 以供下载,而不是保存到文件系统中。
好的,我找到了一种解决方案,尽管它不是最佳实践(但它有效):我用ob_start();
and括起代码,ob_end_clean();
同时找出我输出的 $pdf 字符串而不是 mPDF。
最终代码:
ob_start();
include(DIR_MPDF.'mpdf.php');
$html = $this->render(TRUE);
$mpdf = new mPDF('utf-8','A4');
$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);
$stylesheet = file_get_contents(DIR_APPLICATION.'view/stylesheet/declaration.css');
$mpdf->WriteHTML($stylesheet,1);
$mpdf->WriteHTML($html);
$pdf = $mpdf->Output('', 'S');
$ob = ob_get_contents();
ob_end_clean();
if (headers_sent())
die('Some data has already been output to browser, can\'t send PDF file');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream', false);
header('Content-Type: application/download', false);
header('Content-Type: application/pdf', false);
if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
header('Content-Length: '.strlen($pdf));
}
header('Content-disposition: attachment; filename="invoice.pdf"');
echo $pdf;
exit;