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

"""

*/

}

}

相关推荐
树℡独14 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
嵩山小老虎14 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模15 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a413244715 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler15 小时前
buildroot System configuration
java·服务器·数据库
津津有味道15 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.16 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
Genie cloud16 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
一只自律的鸡17 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)17 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考