找了很多解析方法,最后发现效果都不是特别的好,Libreoffice是叫常见也比较好操作的解析ppt的扩展。操作步骤如下:
1、安装Libreoffice(yum install libreoffice),想要让ppt转换成pdf,执行“export DISPLAY=:0.0 && libreoffice --headless --invisible --convert-to pdf --outdir ./ ./test.pptx”,报错如下图:
解决方案一:yum install tigervnc-server,无效
解决方案二:yum install libreoffice-headless,成功把pptx转换成pdf,不过pdf乱码;
解决乱码:复制C:\Windows\Fonts文件夹中的宋体(simsun.ttc),到/usr/share/fonts/Fonts目录下,如Fonts目录不存在,新建即可,上传成功后,重新执行生成的pdf正常显示
注意:--outdir 后面紧跟的参数是输出到的目录,而最后跟的参数才是ppt等office文档文件所在路径,相对路径,绝对路径都可以执行
2、使用
public function importPPT()
{
$filePath = $_FILES['file']['tmp_name'];
$tmpNameArr = explode('/', $filePath);
$filename = $tmpNameArr[2];
$endPath = RUNTIME_PATH . 'temp/';
$content = 'export DISPLAY=:0.0 && libreoffice --headless --invisible --convert-to pdf --outdir ' . $endPath . ' ' . $filePath;
$res = exec($content, $output, $return_var);
if ($res && $return_var == 0) {
//pdf文件名
$pdfName = $filename . '.pdf';
$im = new \Imagick();
$im->setResolution(50, 50); //设置分辨率 值越大分辨率越高(清晰度控制在50,50,要不然会影响效率)
$im->setCompressionQuality(1000);
$im->readImage($endPath . $pdfName);
$imgArr = [];
foreach ($im as $k => $v) {
$v->setImageFormat('png');
$filePath = RUNTIME_PATH . 'temp/' . md5($k . time()) . '.png';
if ($v->writeImage($filePath) == true) {
$oss = new OssHelper();
$res = $oss->uploadLocal($filePath);
$imgArr[] = $res['url'];
}
}
unlink(RUNTIME_PATH . 'temp/' . $pdfName);
return ['images' => $imgArr];
} else {
return '文件解析失败';
}
}
问题:本地上传成功,但是服务器上一直执行失败
解决方案一(未解决):
$content = 'export DISPLAY=:0.0 && libreoffice --headless --invisible --convert-to pdf --outdir ' . $endPath . ' ' . $filePath . '';
$res = exec($content, $output, $return_var);
dump($res);
得到的错误信息如下:
发现在本地环境只有/usr/lib64下有libstdc++.so.6(服务器上/usr/lib64下也有libstdc++.so.6),但是根据报错信息得知程序执行的时候去找了/opt/lampp/lib下的libstdc++.so.6,所以就造成了not found的问题,所以要更新/opt/lampp/lib下的libstdc++.so.6,但是没找到方法(软连接、直接更换为最新的libstdc++.so.6都试过,都不行)
解决方案二(已解决):
加上系统路径
shell_exec('export LD_LIBRARY_PATH="/usr/lib:/usr/lib64:/usr/local/lib" && export HOME="/tmp" && libreoffice --headless --convert-to pdf ' . $filePath. ' --outdir '. $pdfPath)