來源:https://blog.csdn.net/qq_23564667/article/details/107524645
在做項目中,由於使用的是thinkphp5.1框架,使用tcpdf生成的pdf文件在瀏覽器里顯示輸出文件流字符串;
這個問題只要:關閉調試模式即可
在ThinkPHP5.1上使用TCPDF,具體流程如下:
1、通過Composer下載最新版TCPDF,切換到程序根目錄運行如下命令:
composer require tecnickcom/tcpdf
命令成功執行后,TCPDF會被下載到程序根目錄中的vendor文件夾,如圖:
examples中有60多個典型示例,需要什么功能直接看例子即可,例子對應列表見TCPDF官網:https://tcpdf.org/examples/
2.在控制器中調用TCPDF。
function get_pdf_test(){ $html = <<<EOD <h1>hello word 你好啊</h1> EOD; //新建一個PDF文檔 //L 橫排 P豎排 $orientation='P'; $unit='mm'; $format='A4'; $unicode=true; $encoding='UTF-8'; $diskcache=false; $pdfa=false; $pdf = new \TCPDF($orientation, $unit, $format, $unicode, $encoding, $diskcache, $pdfa); $pdf->AddPage(); $pdf->SetFont('stsongstdlight', '', 14); // 使用中文字體,不設置這個,中文就會亂碼 //如果要對html指定 寬度 writeHTMLCell更方便 $pdf->writeHTMLCell(0, 0, 0, 0, $html, 0, 0, 0, true, '', true); //直接輸入到瀏覽器 //PDF輸出 I:在瀏覽器中打開,D:下載,F:在服務器生成pdf ,S:只返回pdf的字符串 $pdf->Output('demo.pdf', 'I'); }
效果
3、中文亂碼的問題
$pdf->SetFont('stsongstdlight', '', 14); // 使用中文字體,不設置這個,中文就會亂碼
4、TCPDF不能保存中文文件名的解決方法
打開tcpdf.php文件,找到output函數,大約在7554行。
1、注釋以下代碼,大約在7565-7568行:
if ($dest[0] != 'F') { $name = preg_replace('/[\s]+/', '_', $name); $name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name); }
2、搜索該方法代碼,替換如下代碼
header('Content-Disposition: attachment; filename="'.basename($name).'"');
替換為
header('Content-Disposition: attachment; filename="'.($name).'"');
如果需要保存到服務器上的話
在Output前添加一個函數
ob_clean(),代碼如下:
//如果需要自定義路徑,則添加根目錄地址 //服務器存檔模式 ob_clean(); $pdf->Output($_SERVER['DOCUMENT_ROOT'] .'output.pdf', 'F'); //存檔在根目錄 $pdf->Output($_SERVER['DOCUMENT_ROOT'].'/MyFolder/output.pdf', 'F'); //存檔在自定義文件夾中;
如果保存到服務器上出錯的話:
看到網上的解決方案 :
參考資料 : https://www.e-learn.cn/conten...
可以使用 :
$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
我發現的問題是
fopen() 函數打開文件或者 URL。
如果打開文件 : 則必須是 該文件的 絕對路徑
ok 問題解決 !!!!!