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

PHP脚本报错:FPDI_Protection类未找到问题求助

问题分析与解决方案

你代码中的核心错误

  • 无限递归调用:在pdfEncrypt函数内部再次调用自身,同时覆盖了传入的参数值,导致逻辑混乱且无法正常执行。
  • 依赖文件缺失:FPDI_Protection类依赖FPDF和FPDI的核心文件,仅引入FPDI_Protection.php无法加载完整的类结构。
  • 未执行加密操作:代码完全缺失了触发PDF加密的核心方法调用,无法完成密码保护设置。
  • 类初始化错误:旧版FPDI_Protection无需单独调用FPDF方法初始化,且&引用符号在PHP新版本中已无必要。
  • 路径与加载时机问题:将require_once放在函数内部可能导致路径歧义,且重复调用时会跳过加载。

修正后的完整代码

首先确保你下载的压缩包解压后,assets/fpdi目录下包含fpdf.php、fpdi.php、FPDI_Protection.php三个核心文件,然后使用以下代码:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// 提前引入所有依赖文件,避免作用域与重复加载问题
require_once("assets/fpdi/fpdf.php");
require_once("assets/fpdi/fpdi.php");
require_once("assets/fpdi/FPDI_Protection.php");

function pdfEncrypt($origFile, $password, $destFile) {
    // 实例化FPDI_Protection类
    $pdf = new FPDI_Protection();
    // 设置文档尺寸与格式
    $pdf->setPageFormat("P", "in", array('8.27','11.69'));
    
    // 获取原PDF的总页数
    $pagecount = $pdf->setSourceFile($origFile);
    
    // 逐页复制原PDF内容到新文档
    for ($loop = 1; $loop <= $pagecount; $loop++) {
        $tplidx = $pdf->importPage($loop);
        $pdf->addPage();
        $pdf->useTemplate($tplidx);
    }
    
    // 设置PDF保护规则:第一个参数为权限数组,后两个分别是用户密码、所有者密码
    // 示例:允许打印可传 array('print'),空数组表示禁用所有权限
    $pdf->setProtection(array(), $password, $password);
    
    // 将加密后的PDF保存到目标文件
    $pdf->Output($destFile, "F");
}

// 外部调用加密函数(避免递归)
$password = "test";
$origFile = "cv.pdf";
$destFile = "cv_test.pdf";

pdfEncrypt($origFile, $password, $destFile);
?>

关键修正说明

  1. 依赖加载优化:将所有依赖文件的引入放在函数外部,确保类在全局作用域可访问,避免重复加载问题。
  2. 移除递归调用:把函数调用逻辑放在外部,避免无限递归和参数覆盖。
  3. 添加加密核心步骤:通过setProtection方法设置密码与权限,这是实现PDF密码保护的核心操作。
  4. 修正输出逻辑:使用Output方法并指定"F"参数,将加密后的PDF直接保存到目标文件路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:33:58