PHP实现word(office文件)转PDF的功能并添加水印

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文件进行加水印操作,如果处理失败,请查看相关文件夹的权限,是否具有可写权限!!!

第一篇博文,写于2017年11月28日 01:52

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值