PHP生成HTML转PDF遇问题:FPDF显示源码、TCPDF输出报错
解决PHP生成PDF的两个常见问题
问题1:FPDF生成的PDF显示HTML源码而非渲染效果
你用FPDF写的代码能正常生成PDF,但内容是纯HTML文本,这是因为FPDF本身不支持直接解析渲染HTML。它的Cell()方法只是把传入的字符串当成纯文本输出,所以HTML标签会原封不动显示出来。
解决方案:
- 最简单的办法是换用原生支持HTML渲染的PDF库,比如你后来尝试的TCPDF,或者Dompdf、mPDF这些。
- 如果一定要用FPDF,可以使用第三方扩展(比如
fpdf_html),或者自己手动解析HTML标签,把HTML的样式和结构转换成FPDF的方法调用——比如把<br>换成$pdf->Ln(),把<b>文本换成$pdf->SetFont('Helvetica','B',12)再输出,不过这种方式比较繁琐,适合简单的HTML内容。
你的原FPDF代码示例:
if(isset($_POST['content_to_save']) && isset($_POST['name_to_save'])){ $file_name = $_POST['name_to_save']; $file_content = $_POST['content_to_save']; require('fpdf.php'); $pdf = new FPDF(); $pdf->AddPage(); $pdf->SetFont('Helvetica','',12); $pdf->Cell(40,10,$file_content); $content = $pdf->Output('../my_folder/'.$file_name.'.pdf','F'); }
问题2:TCPDF报错「Some data has already been output, can't send PDF file」
这个报错的核心原因是:在TCPDF输出PDF文件之前,已经有内容输出到浏览器或者缓冲区了。这些内容可能是你没注意到的空格、换行,或者之前的echo/print语句,甚至是PHP文件开头的BOM头(UTF-8编码的文件有时候会带这个隐藏字符)。TCPDF需要发送HTTP头来告诉浏览器这是PDF文件,而如果已经有内容输出,HTTP头就没法正常发送,所以会报错。
解决方案:
- 清空输出缓冲区:在调用TCPDF的
Output()方法之前,先启动输出缓冲区并清空所有已输出的内容,代码示例:
if(isset($_POST['po_content_to_save']) && isset($_POST['po_name_to_save'])){ ob_start(); // 启动缓冲区 $file_name = $_POST['po_name_to_save']; $file_content = $_POST['po_content_to_save']; require('TCPDF/tcpdf.php'); $pdf = new TCPDF('P', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetFont('helvetica', '', 12); $pdf->AddPage(); $pdf->writeHTML($file_content); $pdf->Output('../my_folder/'.$file_name.'.pdf', 'I'); ob_end_flush(); // 输出缓冲区内容 }
- 检查代码中的多余输出:删除所有不必要的
echo、print语句,检查PHP文件的开头和结尾有没有多余的空格、换行(比如<?php标签之前的空行,或者?>标签之后的内容——其实PHP文件可以省略?>来避免这个问题)。 - 移除文件BOM头:用文本编辑器(比如VS Code、Notepad++)把PHP文件保存为「UTF-8 无BOM」格式,避免隐藏的BOM字符被输出。
- 如果用框架:确保在调用TCPDF代码之前,没有触发框架的视图渲染或者其他会输出内容的中间件。
你的原TCPDF代码示例:
if(isset($_POST['po_content_to_save']) && isset($_POST['po_name_to_save'])){ $file_name = $_POST['po_name_to_save']; $file_content = $_POST['po_content_to_save']; require('TCPDF/tcpdf.php'); $pdf = new TCPDF('P', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetFont('helvetica', '', 12); $pdf->AddPage(); $pdf->writeHTML($file_content); $pdf->Output('../my_folder/'.$file_name.'.pdf', 'I'); }
内容的提问来源于stack exchange,提问作者Paddy Hallihan
相关产品推荐
相关产品推荐

