You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FPDF生成带密码保护的PDF文件无法正常下载问题求助

问题排查与解决方案

核心问题梳理

你遇到的问题由三个常见错误叠加导致:

  • 前后端请求参数不匹配,逻辑判断触发异常
  • AJAX请求默认不会触发浏览器下载行为,拿到的PDF二进制流会直接交给JS回调处理
  • PHP端未明确输出PDF对应的HTTP响应头,容易被服务器配置覆盖

分步修复代码

1. 修复参数匹配错误

你JS中POST提交的input参数值为generate_pdf,但PHP内的判断条件是$_POST["input"] == "sign in",二者完全不匹配,首先修改PHP判断逻辑:

<?php
if(isset($_POST["input"])){
    // 把sign in改成和前端一致的generate_pdf
    if($_POST["input"] == "generate_pdf"){
        require('FPDF_protection.php');
        $pdf = new FPDF_Protection();
        $pdf->SetProtection(array('print'), $_POST["password"]);
        $pdf->AddPage();
        $pdf->SetFont('Arial');
        $pdf->Write(10,"Hello");
        // 提前加明确的响应头
        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment; filename="Recovery_code.pdf"');
        header('Cache-Control: private, max-age=0, must-revalidate');
        header('Pragma: public');
        // 删掉多余的ob操作,FPDF Output方法已经处理了输出逻辑
        $pdf->Output('D',"Recovery_code.pdf");
        exit; // 输出后直接终止程序,避免后续多余输出
    }
}
?>

2. 替换AJAX请求为可触发下载的实现

方案A:动态表单提交(最稳定,兼容性最好)

直接替换原有AJAX逻辑即可:

// 动态创建表单提交触发下载
const form = document.createElement('form');
form.method = 'POST';
form.action = 'backend.php';
// 插入请求参数
const inputField = document.createElement('input');
inputField.name = 'input';
inputField.value = 'generate_pdf';
form.appendChild(inputField);
const pwdField = document.createElement('input');
pwdField.name = 'password';
pwdField.value = document.getElementById('password').value;
form.appendChild(pwdField);
// 提交后自动移除表单
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);

方案B:AJAX处理二进制流(适合需要先处理响应再下载的场景)

如果必须保留AJAX逻辑,修改为处理blob流手动生成下载链接:

$.ajax({
    url: 'backend.php',
    type: 'POST',
    responseType: 'blob', // 关键配置,指定响应为二进制流
    data: {
        "input": "generate_pdf",
        "password": document.getElementById("password").value
    },
    success: function(response) {
        // 生成临时下载链接触发下载
        const pdfBlob = new Blob([response], { type: 'application/pdf' });
        const downloadUrl = URL.createObjectURL(pdfBlob);
        const aTag = document.createElement('a');
        aTag.href = downloadUrl;
        aTag.download = 'Recovery_code.pdf';
        document.body.appendChild(aTag);
        aTag.click();
        // 清理临时资源
        document.body.removeChild(aTag);
        URL.revokeObjectURL(downloadUrl);
    }
});

内容的提问来源于stack exchange,提问作者user16759636

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:54:03