CentOS 7+环境下PHP+openOffice 转换office文件为PDF

CentOS、java环境、openoffice、jodConverter、php开发环境


1.安装java环境

a. jdk下载(我选的是jdk-8u211-linux-x64.tar.tar.gz)

image.png

b. 将压缩包移到指定目录(自定义)

$ mv jdk-8u211-linux-x64.tar.gz  /usr/local/

解压文件
$ tar -zxvf /usr/local/jdk-8u211-linux-x64.tar.gz


c.配置java环境变量

$ vim /etc/profile

#在文件的最后添加如下内容
#Java Envexport 
JAVA_HOME=/usr/local/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

#生效环境变量
$ source /etc/profile

#测试java环境
$ java -versionjava 

# 结果如下
version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)



2.安装openoffice

a. OpenOffice(我选的是4.1.6)

image.png


b.解压安装包到指定目录 ,进入安装包所在目录 -C 解压目录 (PS :-C 大写不是小写)

# tar -zxvf Apache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz -C /data/soft/


c. 解压完成后会在安装目录下有一个zh-CN 进入RPMS目录下,运行安装yum localinstall *.rpm

# cd /data/soft/zh-CN/RPMS
# yum localinstall *.rpm


d. 安装完成之后进入RPMS目录下的desktop-integration文件夹,安装openoffice4.1.6-redhat-menus-4.1.6-9790.noarch.rpm

# cd /RPMS/desktop-integration
# yum localinstall openoffice4.1.6-redhat-menus-4.1.6-9790.noarch.rpm


e. 安装完成之后启动服务就行,安装软件会安装在/opt/openoffice4目录下,启动soffice服务

- 临时启动 -

# /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard


- 永久启动 -

# nohup /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

****** 记得等一会出现#或者$在关闭窗口,不然服务起不来 *****


f. 查看服务启动状态

# netstat -lnp |grep 8100

如果出现下面的这种情况说明启动成功,后面步骤可忽略

tcp      0    0 127.0.0.1:8100     0.0.0.0:*       LISTEN      13903/soffice.bin


如果没有成功看一下8100是否开放,如果已经开放那么在输入命令openoffice4

# openoffice4
# /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到/opt/openoffice4/program/目录里面,如果没有在安装

# yum install libXext.x86_64


安装完成后在那两个目录中找到复制到/opt/openoffice4/program/下,cp 复制命令

# cp -a usr/lib64/libXext.so.6 /opt/openoffice4/program/


拷贝完成后再输入openoffice4

# openoffice4
# /opt/openoffice4/program/soffice.bin: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory


和上面一样找不到libfreetype.so.6文件,先去那两个目录找,没有在安装,我的是centos 7 的,看一下你对应的操作系统版本下载 https://pkgs.org/download/libfreetype.so.6,下面这个命令直接可以装上

# yum install freetype


再复制到

# cp -a usr/lib64/libfreetype.so.6 /opt/openoffice4/program/
# openoffice4    /** 再试一次 */
# no suitable windowing system found, exiting    /** T_T真麻烦 */


# 报问题:no suitable windowing system found, exiting.

# yum groupinstall "X Window System"


安装完成之后,启动openoffice

# openoffice4    /** 终于没报错了^_^ */


看看服务起来没

# netstat -lnp |grep 8100
# tcp      0    0 127.0.0.1:8100     0.0.0.0:*       LISTEN      13903/soffice.bin


好了,安装完成,我们可以使用openoffice的服务了


# 调错

[root@iZwz9cvxma7yo7ir62efpiZ /]# openoffice4
/opt/openoffice4/program/soffice.bin X11 error: Can't open display: 
   Set DISPLAY environment variable, use -display option
   or check permissions of your X-Server
   (See "man X" resp. "man xhost" for details)

====> 如果出现这个报错,重启就好了




3.安装jodConverter

a. 进入opt目录,下载文件

# cd /opt
# wget https://downloads.sourceforge.net/project/jodconverter/JODConverter/2.2.2/jodconverter-2.2.2.zip


b. 解压

# unzip /opt/jodconverter-2.2.2.zip


c. 进入目录

# cd jodconverter-2.2.2/lib


d. 测试转换

# java -jar jodconverter-cli-2.2.2.jar test.docx test.pdf

显示:

Sep 20, 2017 3:40:05 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection connect

INFO: connected

Sep 20, 2017 3:40:06 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection disposing

INFO: disconnected

查看,已经有了test.pdf,可以直接访问。到这里转换貌似没有问题,但如果文件中有中文,就会出现乱码,接下来解决字体问题。





4.加入中文字体,防止中文乱码


a.进入jdk字体目录

# cd/usr/local/jdk1.8.0_201/jre/lib/fonts/


b. 先将此文件夹下的字体问题,复制到系统字体目录中

# cp /usr/local/jdk1.8.0_201/jre/lib/fonts/* /usr/share/fonts/


ps: 如果拷贝的时候出现cp:omitting directory的错误,例如 cp:omitting directory “bbs” 说明bbs目录下面还有目录,不能直接拷贝

解决办法:

递归拷贝 命令:cp -r bbs ../backup/bbs 解释:-r 这个options是递归的意思

举一反三:

1. 删除的时候也可能出现这种下面有文件不能删除的问题 也用-r 级联删除

2. chmod赋予权限的时候想级联也可以用-R 注意是大写的R


ps: 如何查看你的系统中的字体库

[root@80ec6 fallback]# cat /etc/fonts/fonts.conf
<!-- Font directory list -->
  <dir>/usr/share/fonts</dir>
  <dir>/usr/share/X11/fonts/Type1</dir> <dir>/usr/share/X11/fonts/TTF</dir> <dir>/usr/local/share/fonts</dir>
  <dir>~/.fonts</dir>



c. 在/usr/local/jdk1.8.0_201/jre/lib/fonts/目录下建立fallback目录

# mkdir fallback


d. 将中文字体msyh.ttf(微软雅黑)、msyhbd.ttf(微软雅黑粗体)、simhei.ttf(黑体)、simsun.ttc(宋体)放到/usr/local/jdk1.8.0_201/jre/lib/fonts/fallback目录下(可以在Windows字体库找,或者网上下载)


e. 将新添加的字体也复制到系统字体目录中

# cp /usr/local/jdk1.8.0_201/jre/lib/fonts/fallback/*  /usr/share/fonts/


f. 刷新字体缓存

fc-cache


g. kill掉openoffice进程


[root@80ec6 fonts]# ps -ef | grep openoffice
root 3045 3031 0 06:19 pts/1 00:00:03 /opt/openoffice4/program/soffice.bin -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard

执行kill:
[root@80ec6 fonts]# kill -9 3045


h. 重启后台运行openoffice

# soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &


i. 再次测试文件中带有中文字符的文件

# java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar /opt/test.ppt /opt/test.pdf




5. php调用


a. 修改php.ini文件,因为需要使用到禁用的函数disable_function 中的 exec(),将disable_function中的exec 删除


b. 需要java的绝对路径


c. 执行代码

<?php
$command = "/usr/local/jdk1.8.0_201/bin/java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar  /tmp/test.docx  /tmp/test.pdf";

// $return_var返回值0或1,如果返回0则执行成功,返回1则执行失败
exec($command, $output, $return_var);

if ($return_var != 0) {    
    throw new \Exception("生成PDF失败");
}


d. 到这里应该转换成功了!由于网上的参考比较乱,所以自己写下这边博文留作自己备忘。







===> 注意:此方式强烈不推荐,最好不要在生产线上环境使用!!!!


ps: 执行此文件时,假如出现了由于权限的问题而造成的转换失败,可以尝试使用sudo强制执行命令,但是使用sudo会出现没有权限的问题,往下看

$command = "sudo /usr/local/jdk1.8.0_201/bin/java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar  /tmp/test.docx  /tmp/test.pdf";


1. 先查看启动你php的进程的用户是谁,可以通过在命令行执行:ps -ef | grep php 来查看,或者在php中执行 echo exec('whoami') 来查看

<?php
echo exec("whoami");


2. 由于我使用的是宝塔环境,所以是www用户,那么如果我想让www拥有sudo的权限,我采用的方式将root的所有权限赋予www和www用户组(此方式不推荐,非常不安全,但目前没有想到更合适的方式既能获得权限,又较为安全)

# visudo    /** 执行命令,修改sudo的配置文件,找到下面的地方进行添加 */

## Allow root to run any commands anywhere 
root    	ALL=(ALL)       ALL
www		ALL=(ALL)       ALL 		//新添加这一行
%www		ALL=(ALL)       NOPASSWD: ALL   //设置www组下面的用户使用sudo不需要输入密码


# 如果你希望修改启动你php进程的用户

此时先自己添加一个用户和组。

/usr/sbin/groupadd xxxx
/usr/sbin/useradd -g xxxx -s /bin/bash xxxx

加完用户后、vim /etc/passwd 里面就可以看到你添加的用户了。


# 修改php启动用户为您刚添加的用户

找到你得php安装的地方的php-fpm.conf 。打开配置文件、编辑里面的 user = xxxx;  group = xxxx; (xxxx为您刚才添加的用户)

重启php-fpm(service php-fpm restart)

重复上面查看php启动进程的用户、应该已经变了。


# 最后再将刚才添加的用户xxxx到sudoers里面,步骤参照上面的第2步


===> 注意:此方式强烈不推荐,最好不要在生产线上环境使用!!!!



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.5.2 Zero

 Theme By 优美尚品

Copyright Your WebSite.Some Rights Reserved.