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

文档转换工具依赖包:

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

"""

*/

}

}

相关推荐
HappyGame022 小时前
Linux多进程编程(上)
linux
小红帽6152 小时前
Web服务器(Nginx和Apache)
服务器·前端·nginx
wanhengidc2 小时前
新手玩家如何使用云手机
运维·服务器·网络·游戏·智能手机
半梦半醒*2 小时前
在Linux中部署tomcat
java·linux·运维·服务器·centos·tomcat
半梦半醒*2 小时前
haproxy负载均衡
linux·运维·服务器·centos·负载均衡
黑马金牌编程2 小时前
总结一下MySQL数据库服务器性能优化的几个维度
服务器·数据库·mysql·性能优化
间彧2 小时前
Windows server局域网内配置NTP时间同步
服务器
wayuncn2 小时前
如何选择合适的服务器租用商?
运维·服务器
Dovis(誓平步青云)2 小时前
《Linux 指令实战进阶:从终端新手到 shell 驾驭者的技术跃迁(第三篇)》
linux·运维·服务器
東雪蓮☆2 小时前
Redis 三种服务架构详解:主从复制、哨兵模式与集群
linux·运维·数据库·redis