- 之前写过一个word转html的,这个又来转swf了,原理差不多,重新记录一下.
方案思路:
通过PHP执行shell命令,使用Libreoffice对文件进行转换(不仅可以转换为PDF),再用swftools将PDF转换为swf;
环境+需要的软件:
centos7 + libreoffice + unoconv + swftools
-
文件转换为PDF(或者libreoffice支持的格式)
安装libreoffice:
- 使用yum直接安装:
yum install libreoffice
- 为了防止中文乱码,再装上中文语言支持:
yum -y install libreoffice-langpack-zh-Han*
- 为了能够命令行参数启动libreoffice,再安装:
yum install libreoffice-headless
- 最后安装unoconv方便命令行来执行转换:
wget https://raw.githubusercontent.com/dagwieers/unoconv/master/unoconv
chmod +x unoconv
ln -s /usr/libreoffice/unoconv /usr/bin/unoconv
yum install unoconv
- 到此已经可以用命令行将文件转换为pdf(其他支持的格式)了:
1 .需要注意的第一点是:shell命令需要写对文件路径,下面代码会有演示
2 .直接使用命令行可以执行转换,但是浏览器不行,需要进行如下操作:
必须把www加入root权限组,并且设置为不需要root密码:设置步骤:打开/etc/sudoers文件,100行左右的地方加上这么一句:
"www ALL=(ALL) NOPASSWD: ALL"
3 .如果没有找到上述的sudoer文件的话需要先安装sudo:
yum -y install sudo
代码演示
//原文件
$org_file = \ROOT_PATH . 'public' . '/upload/file/2019-09-10/008.xlsx';
//转成pdf的文件
$out_pdf = \ROOT_PATH . 'public' . '/upload/file/2019-09-10/008.pdf';
//拼接的shell命令
$file2pdf = "sudo /usr/bin/unoconv -f pdf -o " . $org_file . " " . $out_pdf;
//执行文件转换:PDF
\shell_exec($file2pdf);
if (!\file_exists($out_pdf)) {
exit('文件转换失败~');
}
-
将PDF转换为swf
-
因为IE并不能直接打开PDF文件,所以需要预览的话还得转换为swf
-
这里就需要安装swftools了
安装swftools
1 .安装所需的库和组件,如果不安装会提示machine `x86_64-unknown-linux' not recognized
yum install gcc* automake zlib-devel libjpeg-devel giflib-devel freetype-devel
2 .下载编译安装swftools
wget http://www.swftools.org/swftools-2013-04-09-1007.tar.gz
tar vxzf swftools-2013-04-09-1007.tar.gz
cd swftools-2013-04-09-1007.tar.gz
./configure --prefix=/usr/swftools
make
make install
3 .设置swftools环境变量,使pdf2swf成为一个可执行命令
vim /etc/profile
在末尾添加:export PATH=$PATH:/usr/swftools/bin/
4 .验证是否生效
1)拷贝一个带有表格等复杂编排的word文件到home目录,如any.docx
2)执行 unoconv -f pdf any.docx
3)执行 pdf2swf any.pdf any.swf
-
最终的代码(不包含业务逻辑)
/**
* @return string
* 因为IE不能打开PDF,所以需要转换为swf,
* 因为chrome默认关闭flash,会直接下载swf,所以返回pdf
* 实际项目里需要判断浏览器类型
*/
public function fileConversion()
{
//原文件
$org_file = \ROOT_PATH . 'public' . '/upload/file/2019-09-10/008.xlsx';
//转成pdf的文件
$out_pdf = \ROOT_PATH . 'public' . '/upload/file/2019-09-10/008.pdf';
//拼接的shell命令
$file2pdf = "sudo /usr/bin/unoconv -f pdf -o " . $org_file . " " . $out_pdf;
//执行文件转换:PDF
\shell_exec($file2pdf);
if (!\file_exists($out_pdf)) {
exit('文件转换失败~');
}
//为了沙雕IE能用再把pdf专为swf
$out_swf = \ROOT_PATH . 'public' . '/upload/file/2019-09-10/008.swf';
\shell_exec('sudo /usr/swftools/bin/pdf2swf' . ' ' . $out_pdf . ' ' . $out_swf);
if (\file_exists($out_swf)) {
//返回swf的路径给浏览器
$out_swf_path = '/upload/file/2019-09-10/008.swf';
return $out_swf_path;
} else {
exit('文件转换失败~~');
}
}
网友评论