文档转换工具依赖包:
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
"""
*/
}
}