我使用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