PHP实现word(office文件)转PDF的功能并添加水印
开发目的:用PHP实现在linux服务器上在线批量转换office文件成PDF文件,常应用于文件管理较多的后台管理系统。
技术选择:
【PHP+OpenOffice+FPDI+FPDF】
首先要明确这一点,PHP是可以处理文件,但是PHP并不具备直接将office文件转换为PDF。最终实现这一功能还得借助服务器上的相关软件。例如Microsoft Office,不过此软件只能安装在windows的服务器上。所幸还有另外一款自由软件也具备相关的功能,并且还是跨平台的,这就刚好能满足绝大多数以Linux作为服务器的开发者的需求。本文也以此为基础介绍解决办法。(在以windows的服务器上还可以用PHP的COM组件去实现)
实现思路:
用PHP的系统函数,调用linux的相关命令,启用openoffice将office文件转换为PDF文档,并用FPDI和FPDF给PDF文件加上水印。
具体操作步骤
1、在linux服务器上安装openoffice 参考文章
openoffice的下载地址
创建目录
[root@localhost /]# mkdir openoffice/
通过filezilla或xftp将下载的openoffice文件上传上去
解压
[root@localhost /]# tar -zxvf /root/openoffice/Apache_OpenOffice_(安装包名称)
进入解压生成的zh-CN文件夹并查看详情
[root@localhost /]# cd /zh-CN
[root@localhost zh-CN]# ls
会看到三个目录,licenses readmes RPMS
进入到RPMS目录中并查看
[root@localhost zh-CN]# cd RPMS/
执行安装命令
[root@localhost RPMS]#rpm -ivh *.rpm
到这一步就表示安装成功了(安装完成后安装的软件会在**/opt/**下面有一个openoffice4文件夹,得进入该文件夹下面的program才好执行相关的命令,当然这是对于新手而言)
2、启动程序需要安装JDK环境 参考文章
JDK的下载地址
注意:下载文件前先看清楚自己服务器的位数,不然下载了也无法使用!
在usr目录下面建立java安装目录
[root@localhost usr]# mkdir java
将jdk-8u60-linux-x64.tar.gz拷贝到java目录下
解压jdk到当前目录
[root@localhost java]# tar -zxvf jdk-8u60-linux-x64.tar.gz
编辑配置文件,配置环境变量
[root@localhost java]# vim /etc/profile
添加如下内容:JAVA_HOME根据实际目录来
JAVA_HOME=/usr/java/jdk1.8.0_60
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
重启机器或执行命令:source /etc/profile(推荐)实在不好使时重启是最好的选择
sudo shutdown -r now(重启)
查看java的安装情况
java -version(最开始就得执行一遍该命令,确保系统没有安装java)
会得到如下信息:
java version “1.8.0_60”
Java™ SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot™ Client VM (build 25.60-b23, mixed mode)
3、再次启动openoffice看是否好使 参考文章
启动openoffice的命令
[root@centos program]# ./soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard &
注意:一定是在program文件夹下,注意soffice前面的相对路径
查看端口号8100是否启动成功
[root@VM_13_100_centos program]# netstat -nlp
这里不出意外会出现一系列的报错信息 <- _ <- 常见的错误及处理办法见下 ↓
无java运行环境,以上第二点已经解决
出现下面的错误
/opt/openoffice4/program/soffice.bin: error while loading shared libraries: libXext.so.6: cannot open shared object file: No such file or directory
错误原因:在/opt/openoffice4/program/下缺少libXext.so.6文件,可以去/usr/lib64 或者 /usr/lib查看有没有这个文件,如果有可以copy到program目录中,如果没有再安装
# yum install libXext.x86_64
安装完成后在那两个目录中找到并复制到program目录下,命令为:
# cp -a usr/lib64/libXext.so.6 /opt/openoffice4/program/
出现下面的错误
/opt/openoffice4/program/soffice.bin: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory
#yum install freetype 其余命令和上一个错误处理相同
出现错误 no suitable windowing system found, exiting.
错误原因:没有相关的windows窗口
# yum groupinstall “X window System”
再次启动,应该是没有问题了,v(如果还是启动不了,先看是不是被防火墙限制了,记住,一定要重新启动系统!!!很重要!!!)
4、安装java的文件包管理工具jodconverter.2.2.2
在/usr目录下建立了一个wenku文件夹,当然这个是自定义的,可以放在任何位置,不过对于新手来说还是按照文档叙述来操作。避免入坑!将下载的zip文件放入wenku文件夹,用unzip命令解压。
转换文件的系统命令:
java -jar /usr/wenku/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar test.docx 1.pdf
test.doc为要转换文件的路径,1.pdf为输出文件路径
5、编写文件上传程序
然后编写文件上传程序(文件使用$_FILES接值,上传文件失败时很多原因都是服务器的文件夹权限问题),真正处理文件转换的时候得用到php的系统函数system,这里会有一个坑,默认的这种系统函数都是被禁止的,先通过phpinfo查询,然后解禁。另外如果调用系统函数失败,一方面可能是因为php的用户(www)的权限不够(很少),最关键的原因是用php的系统函数处理java指令的时候一定要用绝对路径!!!
p = “/usr/java/jdk1.7.0_80/bin/java -jar “. $jodconverter_path . ‘ ‘ . $source_dir . ‘ ‘ . $dist_dir;
exec($p, $log, $status);
另外友情提醒一下刚上道的朋友,服务器上的文件名能不用中文就不要用中文,即使要上传中文名的文件至少也得做一下处理啊,文件编码真的坑不起的!唔~
大杉遇到过一次情况,前几位开发小哥哥直接将GBK的文件名传了上去,然后服务器是UTF-8的编码,用转换程序的时候一直提示失败,原因就是找不到文件。。。这种情况下可以在命令里面加 export LANG=en_US.UTF-8;
6、处理解决转换文件乱码的问题
对于用openoffice转换文件中文名乱码的问题可以参考这篇文章,这里就不再多做阐述了~ 主要手懒,改天有时间再加进来!
参考文章点击这里
7、用FPDI和FPDF给PDF文件加上水印
同样,手懒,改天再补充进来,有篇文章介绍的不错了。参考文章点击这里
原理:利用FPDI来加载已知的PDF文件,用FPDF对PDF文件进行加水印操作,如果处理失败,请查看相关文件夹的权限,是否具有可写权限!!!