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

如何在PHPWord PDF渲染器中设置PSR Logger 3版本并解决兼容错误

解决PHPWord+MPDF的PSR Logger版本冲突问题

错误原因分析

这个编译错误源于PSR-Log组件版本不兼容:

  • PSR-Log 2.0+版本中,NullLogger::log()方法的$message参数新增了Stringable|string类型声明
  • 旧版(1.x)LoggerInterface::log()的参数无类型约束,当Composer加载了不同版本的PSR-Log文件时,就会触发方法声明不兼容的冲突

解决步骤

1. 统一PSR-Log版本

先执行命令查看当前安装的PSR-Log版本:

composer show psr/log

在composer.json的require节点添加明确的版本约束(PHPWord v0.18+和MPDF v8+均支持2.x或3.x版本):

"psr/log": "^2.0 || ^3.0"

执行更新命令让Composer统一版本:

composer update psr/log

2. 修正PHPWord的PDF渲染器路径

你之前的setPdfRendererPath设置错误,正确路径应指向MPDF的安装目录,而非PHPWord的PDF.php文件:

// 指向MPDF的安装根目录
\PhpOffice\PhpWord\Settings::setPdfRendererPath($_SERVER["DOCUMENT_ROOT"] . '/local/vendor/mpdf/mpdf');
// 指定使用MPDF作为PDF渲染器
\PhpOffice\PhpWord\Settings::setPdfRendererName(\PhpOffice\PhpWord\Settings::PDF_RENDERER_MPDF);

3. 用PsrLogAwareTrait配置自定义Logger

通过PsrLogAwareTrait可以给PHPWord组件注入自定义Logger,避免依赖默认Logger的版本问题:

use Psr\Log\LoggerAwareTrait;
use Psr\Log\NullLogger;

// 自定义支持Logger注入的Writer类
class CustomPdfWriter extends \PhpOffice\PhpWord\Writer\PDF
{
    use LoggerAwareTrait;

    public function __construct(\PhpOffice\PhpWord\PhpWord $phpWord)
    {
        parent::__construct($phpWord);
        // 默认使用NullLogger,也可替换为Monolog等实际日志组件
        $this->setLogger(new NullLogger());
    }
}

// 使用示例
$phpWord = new \PhpOffice\PhpWord\PhpWord();
$pdfWriter = new CustomPdfWriter($phpWord);
// 若有实际Logger实例,可直接注入
// $logger = new \Monolog\Logger('phpword_log');
// $pdfWriter->setLogger($logger);

也可以直接给PHPWord核心类注入Logger(PhpWord类已实现LoggerAwareInterface):

$phpWord = new \PhpOffice\PhpWord\PhpWord();
$phpWord->setLogger(new \Psr\Log\NullLogger());

验证

完成上述操作后重新运行代码,即可消除PSR-Log的方法兼容错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:48:10