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); ?>
关键修正说明
- 依赖加载优化:将所有依赖文件的引入放在函数外部,确保类在全局作用域可访问,避免重复加载问题。
- 移除递归调用:把函数调用逻辑放在外部,避免无限递归和参数覆盖。
- 添加加密核心步骤:通过
setProtection方法设置密码与权限,这是实现PDF密码保护的核心操作。 - 修正输出逻辑:使用
Output方法并指定"F"参数,将加密后的PDF直接保存到目标文件路径。
内容的提问来源于stack exchange,提问作者user10418143
相关产品推荐
相关产品推荐

