2024-01-04
服务器
libreoffice7.5
735

一、安装 libreoffice

1.wget 安装(推荐)
yum list installed | grep libreoffice
yum remove libreoffice*

# 报错:/opt/libreoffice7.5/program/soffice.bin: error while loading shared libraries: libcairo.so.2...
yum install -y cairo cups-libs libSM libXinerama

cd /usr/local/download

wget http://mirrors.cloud.tencent.com/libreoffice/libreoffice/stable/7.5.2/rpm/x86_64/LibreOffice_7.5.2_Linux_x86-64_rpm.tar.gz

tar -axvf LibreOffice_7.5.2_Linux_x86-64_rpm.tar.gz
cd LibreOffice_7.5.2.2_Linux_x86-64_rpm/RPMS/

yum -y localinstall *.rpm
yum install -y libXinerama cups-libs dbus-glib cairo libSM

# 创建软链接
ln -s /usr/bin/libreoffice7.5 /usr/bin/libreoffice # ln -s 源文件 目标文件

# 检测版本
libreoffice --version
libreoffice7.5 --version
2.转换命令
libreoffice --help

# .doc 格式转 .docx 格式
libreoffice --headless --convert-to docx /www/docx/xxx.doc --outdir /www/docx/

# .docx 格式转 .pdf 格式
libreoffice --headless --convert-to pdf /www/docx/xxx.docx --outdir /www/pdf/
3.word 转 pdf 中文乱码
yum groupinstall "fonts"

vim /etc/locale.conf

LANG="zh_CN.UTF-8" # 将内容 en_US 改为 zh_CN

source /etc/locale.conf
4.修改默认字体
cd /usr/share/fonts/ 

mkdir upload-fonts
chmod -R 777 upload-fonts # 将字体上传到该目录

fc-cache -fv # 更新字体缓存
fc-cache -fv /usr/share/fonts/upload-fonts # 更新指定目录 

二、设置权限

1.用户组、用户
# 添加用户组、用户,如果已安装 nginx,则不用设置
groupadd nginx
useradd -g nginx -s /bin/bash
cat /etc/passwd # 查看文件

# 删除用户、用户组
userdel nginx
groupdel nginx
2.修改 php-fpm 文件
find / -name php-fpm.conf
vim /usr/local/software/php8.1/etc/php-fpm.conf # 找到最后一行
vim /usr/local/software/php8.1/etc/php-fpm.d/www.conf # 修改此文件

# 修改 www.conf 中 user, group 值 ,将 apache 改为 nginx
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

# 重启 php-fpm
service php-fpm restart
3.修改 sudoers 文件
chmod 600 /etc/sudoers 
vim /etc/sudoers

# root 这一行下边添加两行
root    ALL=(ALL)       ALL
nginx   ALL=(ALL)       ALL   # 新添加这一行
%nginx  ALL=(ALL)       NOPASSWD: ALL   # 设置 xxx 组下面的用户使用 sudo 不需要输入密码

# 撤销文件写权限
chmod 400 /etc/sudoers 
4.php 命令
$cmd = 'sudo libreoffice --headless --convert-to pdf ' . $docxName . ' --outdir ' . $pdfPath;
exec($cmd . ' 2>&1', $output, $status);
exec('sudo chmod 777 ' . $pdfName); 

三、php 相关代码

    /**
     * @param string $path 文件全路径
     * @param string $officeFile 全路径文件名
     * @param string $title 文件名称,不含扩展名
     * @return string
     * @throws BusinessException
     */
    public static function createPdf($path, $officeFile, $title)
    {
        if (!is_file($officeFile)) throw new BusinessException(ErrorCode::$officeFileNotExistError);

        // 生成目录
        mkdirs($path);

        /**
         * yum install libreoffice 将 word 转成 pdf
         * 2>&1:表示shell脚本执行过程中的错误信息会被输出
         * output:数组格式,用于存储 2>&1 输出的错误信息
         * status:shell 脚本的执行状态,0 表示成功,其他都表示失败
         **/
        $cmd = "sudo libreoffice --headless --convert-to pdf --outdir " . $path . " '" . $officeFile . "'"; // 注意中文名称处理
        exec($cmd . ' 2>&1', $output, $status);

        $pdfName = rtrim($path, '/') . '/' . $title . '.pdf';
        exec("sudo chmod 777 '" . $pdfName . "'"); // pdf root 用户创建

        write_log('pdf 转换命令:' . $cmd);
        write_log('pdf 命令执行结果:' . var_export($output, true));

        return $pdfName;
    }