Centos安装unoconv文档转换工具并在PHP中使用phpword替换word模板中的变量后,使用unoconv将word转换成pdf

发布于:2025-09-02 ⋅ 阅读:(16) ⋅ 点赞:(0)

文档转换工具依赖包:
yum install -y libreoffice.x86_64

安装中文包:
yum install -y libreoffice-langpack-zh-Hans.x86_64

或者安装windows上的中午字体,推荐linux centos安装中文字体-CSDN博客

安装文档转换工具:
yum install -y unoconv
转换命令使用方式: 
unoconv -h 帮助信息
unoconv -f pdf test.docx 将word转化为pdf

或者指定转换后的文件:unoconv -v -f pdf -o ./111.pdf ./111.docx 2>&1 &
unoconv -vvv -f pdf test.docx 将会输出调试信息

PHP中使用phpword替换word模板中的变量后,使用unoconv将word转换成pdf:

<?php
namespace app\index\controller;

use Symfony\Component\Process\Process;
use PhpOffice\PhpWord\TemplateProcessor;
class Ceshi extends BaseController
{
    public function index(){
        //phpword替换word模板中的变量并下载替换后的word文件
        $documentTemplate = './222.docx';
        $doc = new TemplateProcessor($documentTemplate);
        $replace = '============****==================';
        $replace01 = '*******申请人张三有限责任公司********';
        $doc->setValue('val001', $replace);
        $doc->setValue('val002', $replace01);
        //Temporary document filename (with path)
        $tempDocumentFilename = $doc->save();
        $fileName = '222.docx';
        // 下载文件
        ob_clean();
        header('Pragma: public');
        header("Access-Control-Expose-Headers: Content-Disposition");
        header("Accept-Ranges: bytes");
        header('ResponseType: blob');
        header('Last-Modified:' . gmdate('D, d M Y H:i:s') . 'GMT');
        header('Cache-Control:no-store, no-cache, must-revalidate');
        header('Cache-Control:pre-check=0, post-check=0, max-age=0');
        header('Content-Transfer-Encoding:binary');
        header('Content-Encoding:none');
        header('Content-type:multipart/form-data');
        header("Content-Disposition:attachment; filename=" . urlencode($fileName));//设置下载的默认文件名
        header('Content-length:' . filesize($tempDocumentFilename));
        $fp = fopen($tempDocumentFilename, 'r');
        while (connection_status() == 0 && $buf = @fread($fp, 8192)) {
            echo $buf;
        }
        fclose($fp);
        @unlink($tempDocumentFilename);
        die;
        
        //方式二:
        //phpword替换word模板中的变量,保存后获取临时文件,然后使用unoconv将word转换成pdf
        try{
            $documentTemplate = './222.docx';
            $doc = new TemplateProcessor($documentTemplate);
            $replace = '============*****==================';
            $replace01 = '*******申请人张三有限责任公司********';
            $doc->setValue('val001', $replace);
            $doc->setValue('val002', $replace01);
            //Temporary document filename (with path)
            $tempDocumentFilename = $doc->save();
            
            $process = new Process(
                ['unoconv','-v','-f','pdf', '-o' ,'./555.pdf',$tempDocumentFilename],
                null,
                ['PATH'=>'/usr/bin:/usr/local/bin']
                );
            $process->run();
            if($process->getExitCode() == 0){
                echo 'ok';
                @unlink($tempDocumentFilename);
                exit();
            }else{
                dd([
                    $process->getExitCode(),
                    $process->getOutput(),
                    $process->getErrorOutput(),
                ]);
            }
        }catch (\Think\Exception $e){
            dd($e);
        }
        
        //方式一:
        //phpword替换word模板中的变量,并另存为word文件,然后使用unoconv将word转换成pdf
        try{
            $documentTemplate = './222.docx';
            $doc = new TemplateProcessor($documentTemplate);
            $replace = '============*******==================';
            $replace01 = '*******申请人张三有限责任公司********';
            $doc->setValue('val001', $replace);
            $doc->setValue('val002', $replace01);
            $doc->saveAs('./555.docx');
            
            $process = new Process(
                ['unoconv','-v','-f','pdf', '-o' ,'./555.pdf','./555.docx'],
                null,
                ['PATH'=>'/usr/bin:/usr/local/bin']
                );
            $process->run();
            if($process->getExitCode() == 0){
                echo 'ok';
                @unlink('./555.docx');
                exit();
            }else{
                dd([
                    $process->getExitCode(),
                    $process->getOutput(),
                    $process->getErrorOutput(),
                ]);
            }
        }catch (\Think\Exception $e){
            dd($e);
        }
        
        
        
        /**
         * unoconv 是一款基于 Python 的命令行工具,用于执行文档格式转换。
         * 它可以将一种文档格式(如 DOC、PPT、XLS 等)转换为另一种文档格式(如 PDF、ODT、ODP 等)。
         * Unoconv 是一个基于 LibreOffice 或 OpenOffice 的开源命令行工具,主要用于文档格式转换。
         * 它通过调用这些办公软件的 UNO 接口实现文件转换,支持多种格式互转,如 DOCX 、 PDF 、 XLSX 等
         * 通用网络对象(Universal Network Objects, UNO)是OpenOffice.org与LibreOffice套件采用的跨语言组件模型,
         * 基于接口设计实现不同编程语言、对象模型及机器架构的互操作性,支持通过局域网或互联网进行组件通信。
         * 其运行时环境为UNO运行时环境(URE),组件可通过C++、Java、Python等语言实现,
         * 并允许访问StarSuite Basic、OLE自动化和.NET公共语言基础结构,授权遵循LGPL协议 。
         * 该模型支持外部程序调用组件实现文档格式转换,典型应用包括Docvert、JODConverter等工具。
         * 开发者可通过编写UNO组件扩展办公套件功能,这类扩展称为“Add-Ons”,
         * 使用unopkg工具注册组件后可通过ProtocolHandler和JobDispatch服务集成至软件界面。
         * UNO接口还可直接操作OpenOffice的Writer、Calc等组件,实现文档创建、属性设置及内容编辑
         */
        //方式五:
        //使用Symfony Process 组件,一个用于在 PHP中执行外部命令的库
        //由于unoconv命令需要python中的PATH变量,而php-fpm默认是关闭PATH变量的,web环境获取不到PATH
        //所以通过php-fpm运行命令,需要加上PATH变量
        //Symfony Process第三个参数是设置环境变量的
        $process = new Process(
            ['unoconv','-v','-f','pdf', '-o' ,'./111.pdf','./111.docx'],
            null,
            ['PATH'=>'/usr/bin:/usr/local/bin']
        );
        $process->run();
        if($process->getExitCode() == 0){
            dd('ok');
        }else{
            dd([
                $process->getExitCode(),
                $process->getOutput(),
                $process->getErrorOutput(),
            ]);
        }
        
        //方式四:
        $bool = putenv('PATH=/sbin:/bin:/usr/sbin:/usr/bin');
        if($bool){
            exec('unoconv -v -f pdf -o ./111.pdf ./111.docx 2>&1 &', $output, $return_var);
            if($return_var == 0){
                dd('ok');
            }else{
                dd('error');
            }
        }else{
            dd('PATH变量设置失败');
        }
        
        //方式三:
        $bool = putenv('PATH=/sbin:/bin:/usr/sbin:/usr/bin');
        if($bool){
            $runinfo = shell_exec('unoconv -v -f pdf -o ./111.pdf ./111.docx 2>&1 &');
            if(!empty($runinfo)){
                dd('ok');
            }else{
                dd('error');
            }
        }else{
            dd('PATH变量设置失败');
        }
        
        //方式二:
        //由于unoconv命令需要python中的PATH变量,而php-fpm默认是关闭PATH变量的,web环境获取不到PATH
        //所以通过php-fpm运行命令,需要加上PATH变量
        exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin unoconv -v -f pdf -o ./111.pdf ./111.docx 2>&1 &', $output, $return_var);
        if($return_var == 0){
            dd('ok');
        }else{
            dd('error');
        }
        /**
         * var_dump($output);
         * array(3) { [0]=> string(22) "Input file: ./111.docx" [1]=> string(55) "Selected output format: 
         * Portable Document Format [.pdf]" [2]=> string(22) "Output file: ./111.pdf" }
         * 
         * dd($return_var);
         * ^ 0
         */
        
        
        //方式一:
        //由于unoconv命令需要python中的PATH变量,而php-fpm默认是关闭PATH变量的,web环境获取不到PATH
        //所以通过php-fpm运行命令,需要加上PATH变量
        //unoconv -v, --verbose be more and more verbose (-vvv for debugging)
        //1>/dev/null 2>&1 & 表示后台运行,并且没有任何输出
        //$runinfo = shell_exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin unoconv -v -f pdf -o ./111.pdf ./111.docx 1>/dev/null 2>&1 &');
        //1>log.txt 2>&1 & 表示后台运行,输出到日志文件
        //$runinfo = shell_exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin unoconv -v -f pdf -o ./111.pdf ./111.docx 1>log.txt 2>&1 &');
        $runinfo = shell_exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin unoconv -v -f pdf -o ./111.pdf ./111.docx 2>&1 &');
        if(!empty($runinfo)){
            dd('ok');
        }else{
            dd('error');
        }
        /**
         * dd($runinfo);
         * ^ """
        Input file: ./111.docx
        Selected output format: Portable Document Format [.pdf]
        Output file: ./111.pdf
        """
         */
    }
}
 


网站公告

今日签到

点亮在社区的每一天
去签到