使用PHP+LibreOffice+ncjoes/office-converter转换文件报错求助
错误根因
你遇到的报错本质是$this->converter属性未被初始化,为null值时调用了成员方法导致的。之所以这个属性没初始化,是因为你直接手动实例化了继承自PHPUnit TestCase的测试类,并且直接调用测试方法:
setUp()是PHPUnit框架的约定方法,只有通过PHPUnit命令行工具运行测试用例时,框架才会自动在每个测试方法执行前调用setUp(),你手动new测试类后直接调用测试方法,setUp()全程没有执行,所以$this->converter没有被赋值。
解决方案
方案1:按PHPUnit规范运行测试(适合调试测试用例)
不要直接运行这个PHP文件,在项目根目录执行命令调用PHPUnit运行测试即可:
./vendor/bin/phpunit converter.php
这种情况下PHPUnit会自动触发setUp()执行,完成$converter属性的初始化。
方案2:改写代码脱离PHPUnit依赖(适合实际业务使用)
如果你只是要实现文档转换功能,不需要继承PHPUnit测试类,直接写业务逻辑即可,参考代码如下:
<?php if (!file_exists(__DIR__.'/vendor/autoload.php')) { echo 'autoload.php 不存在!'; exit; } require __DIR__.'/vendor/autoload.php'; use NcJoes\OfficeConverter\OfficeConverter; $DS = DIRECTORY_SEPARATOR; $file = __DIR__."{$DS}sources{$DS}test.docx"; $outDir = __DIR__."{$DS}results"; // 提前确认output目录存在且有读写权限,LibreOffice运行也需要对应目录权限 if (!is_dir($outDir)) { mkdir($outDir, 0777, true); } $converter = new OfficeConverter($file, $outDir); // 转换为PDF $outputPdf = $converter->convertTo('result.pdf'); var_dump('PDF转换完成,文件路径:'.$outputPdf); // 转换为HTML $outputHtml = $converter->convertTo('result.html'); var_dump('HTML转换完成,文件路径:'.$outputHtml);
额外注意事项
- 确认你的LibreOffice安装路径已经加入Windows系统环境变量
PATH,或者在初始化OfficeConverter时手动指定LibreOffice的可执行文件路径:// 示例,替换为你实际的LibreOffice安装路径下soffice.exe的路径 $converter = new OfficeConverter($file, $outDir, 'C:\Program Files\LibreOffice\program\soffice.exe'); - 确认
sources/test.docx文件真实存在,results目录有PHP进程的读写权限。
内容的提问来源于stack exchange,提问作者Huseyin Telli
相关产品推荐
相关产品推荐

