FPDF生成PDF在部分浏览器iframe中自动下载而非内嵌显示求助
问题:FPDF生成的PDF在iframe中自动下载而非内嵌显示
通过选择框提交数据后,多数浏览器可通过iframe展示对应PDF,但使用FPDF生成PDF时,即便设置Output('output.pdf', 'I')(内嵌显示模式),PDF仍自动下载,无法内嵌显示。
前端代码
<iframe src="../admin/customer_ledger_report.php?sel_customer=<?php echo $_REQUEST['sel_customer'];?>&financial_id=<?php echo $_REQUEST['financial_id'];?>&sel_company=<?php echo $_REQUEST['sel_company'];?>" width="100%" style="min-height: 768px;overflow-y: scroll;"></iframe> <script> $(function () { $('#jvalidate').submit(function (e) { e.preventDefault(); // 获取选中值 var financial_id = $('#financial_id').val(); var sel_company = $('#sel_company').val(); var sel_customer = $('#sel_customer').val(); // 构造iframe的URL var iframeUrl = "../admin/customer_ledger_report.php?sel_customer=" + sel_customer + "&financial_id=" + financial_id + "&sel_company=" + sel_company; // 设置iframe的src $('#pdf-iframe iframe').attr('src', iframeUrl); if (financial_id && sel_company && sel_customer) { // 显示iframe $('#pdf-iframe').show(); displayPieChart(sel_company, sel_customer, financial_id); } return false; }); }); </script>
后端(customer_ledger_report.php)原代码
<?php header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="output.pdf"'); header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); require('session.php'); require('pdf-generate/fpdf.php'); extract($_REQUEST); $pdf->Ln(); $pdf->Output('output.pdf', 'I'); $pdf->Close();
解决方法
1. 调整HTTP头的设置顺序与内容
- HTTP头必须放在所有输出之前:将
header()调用移到require语句之前,避免session.php或其他文件输出内容导致头无法生效。 - 补充
Content-Transfer-Encoding: binary头,提升跨浏览器兼容性。 - 确保
Content-Disposition的引号格式正确,避免转义问题。
2. 修正FPDF的输出逻辑
- 必须先初始化FPDF对象(原代码缺失
$pdf = new FPDF();步骤),否则会报错。 - 将
$pdf->Close()移到Output()之前,或直接移除——FPDF的Output()方法会自动完成资源清理。 - 在
Output()后添加exit;,防止后续代码输出多余内容破坏PDF二进制流。
3. 清理多余输出
- 检查
session.php及其他引入文件,确保没有额外的空格、换行或echo输出,这些会干扰PDF的正确渲染。
修正后的后端代码
<?php // 先设置所有HTTP头,确保在任何输出之前 header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="output.pdf"'); header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Content-Transfer-Encoding: binary'); require('session.php'); require('pdf-generate/fpdf.php'); extract($_REQUEST); // 初始化FPDF对象 $pdf = new FPDF(); $pdf->AddPage(); // 这里添加你的PDF内容生成逻辑(如文字、表格、数据填充等) $pdf->Ln(); // 内嵌输出PDF $pdf->Output('output.pdf', 'I'); // 终止脚本,避免后续输出 exit; ?>
前端小优化
确保iframe的容器ID正确匹配JS选择器,建议给外层容器和iframe添加明确ID:
<div id="pdf-iframe" style="display: none;"> <iframe id="report-iframe" src="" width="100%" style="min-height: 768px; overflow-y: scroll;"></iframe> </div>
内容的提问来源于stack exchange,提问作者Sanju Nath
相关产品推荐
相关产品推荐

