我使用mPDF library直接从HTML输出生成PDF文档。问题是这个mPDF库是按原样编写的,它产生了数十个通告(未定义的索引,未定义的偏移量等)。我试图阻止输出它们,但没有任何帮助。无法摆脱mPDF中的PHP通知
我试图把error_reporting(E_ALL^E_NOTICE);
以及error_reporting(E_ALL & ~E_NOTICE);
,我插入到我的index.php,到类和方法,直接包括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将输出保存到文件中(使用例如file_put_contents()
)时,PDF是有效的,因此,即使我使用复杂HTML可读 - 但仍然是通告被印刷到浏览器。无论如何,我需要提供PDF下载,而不是保存到文件系统。
OK,我找到了一个解决方案,虽然它不是最好的做法(但它的工作原理):我附上代码ob_start();
和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;
可能mPDF在被调用时正在改变错误级别/报告吗?您可以尝试通过使用具有相关表达式的'@'运算符来抑制错误,但这不是一个好习惯。可能是库的更新或配置设置? (我不知道mPDF) – hakre 2012-01-30 17:22:10
@hakre,没有这样的设置(AFAIK),但我会尝试@符号。 – shadyyx 2012-01-30 17:27:51
@shaddyyx:确保由于您的输入而未给出警告。只是说,你的代码看起来很干净,可能HTML不可接受? – hakre 2012-01-30 17:30:31