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

"""

*/

}

}

相关推荐
2004v20046 小时前
交叉编译 手动安装 libzip 库 移植ARM 需要 zlib的
linux·运维·arm开发
Clownseven6 小时前
堡垒机(跳板机)入门指南:构建更安全的多服务器运维架构
运维·服务器·安全
TG_yilongcloud7 小时前
亚马逊云代理商:如何选择适合的AWS EC2实例类型?
服务器·云计算·aws·实例类型
ajassi20007 小时前
开源 C++ QT Widget 开发(十)IPC进程间通信--共享内存
linux·c++·qt·开源
努力努力再努力@李7 小时前
利用本地电脑上的MobaXterm连接虚拟机上的Ubuntu
linux·运维·ubuntu
是店小二呀8 小时前
Linux | 走进网络世界:MAC、IP 与通信的那些事
linux·网络·macos
linux开发之路8 小时前
C++精选面试题集合(100份大厂面经提取的200+道真题)
linux·c++·网络编程·数据结构与算法·c++面试题
czhc11400756638 小时前
LINUX 91 SHELL:删除空文件夹 计数
linux·javascript·chrome
半梦半醒*9 小时前
ansible变量
linux·运维·开发语言·ansible·运维开发