PHP操作LibreOffice将替换变量后的word文件转换为PDF文件

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

<?php

namespace app\lib;

use think\Exception;

/**

* 单个或批量将Word文件转换为PDF

* 需要服务器安装LibreOffice

* yum install -y libreoffice.x86_64

*/

class WordToPdfConverter {

// LibreOffice可执行文件路径

private $libreOfficePath;

// 构造函数,设置LibreOffice路径

public function __construct($libreOfficePath = '/usr/bin/libreoffice') {

this-\>libreOfficePath = libreOfficePath;

}

/**

* 检查LibreOffice是否可用

*/

public function checkLibreOffice() {

if (!file_exists($this->libreOfficePath)) {

throw new Exception("LibreOffice未找到,请检查路径设置");

}

return true;

}

/**

* 转换单个Word文件为PDF

* @param string $inputFile 输入Word文件路径

* @param string $outputDir 输出PDF目录

* @return bool 转换是否成功

*/

public function convertToPdfByShellExec(inputFile, outputDir) {

// 检查输入文件是否存在

if (!file_exists($inputFile)) {

throw new Exception("输入文件不存在: " . $inputFile);

}

// 确保输出目录存在

if (!file_exists($outputDir)) {

mkdir($outputDir, 0755, true);

}

// 获取文件名(不含扩展名)

filename = pathinfo(inputFile, PATHINFO_FILENAME);

// 核心-构建转换命令

// --headless: 无界面模式

// --convert-to pdf: 转换为PDF

// --outdir: 输出目录

//libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /output/path input.docx

command = escapeshellcmd(this->libreOfficePath) .

' --headless --convert-to pdf:writer_pdf_Export --outdir '

.escapeshellarg(outputDir).' '.escapeshellarg(inputFile).' 2>&1 &';

// 执行命令

shell_exec($command);

// 检查是否转换成功

pdfFile = outputDir . '/' . $filename . '.pdf';

if (file_exists($pdfFile)) {

return [

'success' => true,

'pdf_path' => $pdfFile,

'message' => '转换成功'

];

} else {

return [

'success' => false,

'input_file' => $inputFile,

'message' => '转换失败'

];

}

}

/**

* 转换单个Word文件为PDF

* @param string $inputFile 输入Word文件路径

* @param string $outputDir 输出PDF目录

* @return bool 转换是否成功

*/

public function convertToPdfByExec(inputFile, outputDir) {

// 检查输入文件是否存在

if (!file_exists($inputFile)) {

throw new Exception("输入文件不存在: " . $inputFile);

}

// 确保输出目录存在

if (!file_exists($outputDir)) {

mkdir($outputDir, 0755, true);

}

// 获取文件名(不含扩展名)

filename = pathinfo(inputFile, PATHINFO_FILENAME);

// 核心-构建转换命令

// --headless: 无界面模式

// --convert-to pdf: 转换为PDF

// --outdir: 输出目录

//libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /output/path input.docx

command = escapeshellcmd(this->libreOfficePath) .

' --headless --convert-to pdf:writer_pdf_Export --outdir '

.escapeshellarg(outputDir).' '.escapeshellarg(inputFile).' 2>&1 &';

// 执行命令

\exec(command, output, $returnVar);

// 检查是否转换成功

pdfFile = outputDir . '/' . $filename . '.pdf';

if (returnVar === 0 \&\& file_exists(pdfFile)) {

return [

'success' => true,

'pdf_path' => $pdfFile,

'message' => '转换成功'

];

} else {

return [

'success' => false,

'input_file' => $inputFile,

'message' => '转换失败,错误码: ' . returnVar . ', 输出: ' . implode("\\n", output)

];

}

}

/**

* 批量转换目录中的Word文件

* @param string $inputDir 输入目录

* @param string $outputDir 输出目录

* @param array $extensions 要处理的文件扩展名

* @return array 转换结果

*/

public function batchConvertToPdf(inputDir, outputDir, $extensions = ['doc', 'docx']) {

if (!is_dir($inputDir)) {

throw new Exception("输入目录不存在: " . $inputDir);

}

$results = [];

directory = new \\RecursiveDirectoryIterator(inputDir);

iterator = new \\RecursiveIteratorIterator(directory);

regex = new \\RegexIterator(iterator, '/^.+\.(' . implode('|', extensions) . ')/i', \RecursiveRegexIterator::GET_MATCH);

foreach (regex as file) {

filePath = file[0];

results\[\] = this->convertToPdfByShellExec(filePath, outputDir);

}

return $results;

}

}

/*******************************************************

<?php

namespace app\index\controller;

use app\BaseController;

use PhpOffice\PhpWord\TemplateProcessor;

use app\lib\WordToPdfConverter;

use think\Exception;

class Ceshi extends BaseController

{

public function index(){

//使用示例

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();

// 根据操作系统设置正确的LibreOffice路径

// Windows示例: 'C:/Program Files/LibreOffice/program/soffice.exe'

// Linux示例: '/usr/bin/libreoffice'

// Mac示例: '/Applications/LibreOffice.app/Contents/MacOS/soffice'

$converter = new WordToPdfConverter('/usr/bin/libreoffice');

// 检查LibreOffice是否可用

$converter->checkLibreOffice();

// 设置输入文件和输出目录

inputFile = tempDocumentFilename;

// PDF输出目录

$outputDir = '.';

res_arr = converter->convertToPdfByShellExec(inputFile, outputDir);

if($res_arr['success']){

dd(rename($res_arr['pdf_path'], './123.pdf'));

}else{

dd($res_arr);

}

} catch (Exception $e) {

echo "错误: " . $e->getMessage() . "\n";

exit;

}

}

}

相关推荐
身如柳絮随风扬18 分钟前
Java中的CAS机制详解
java·开发语言
韩立学长2 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
froginwe112 小时前
Scala 循环
开发语言
m0_706653232 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你912 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu3 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain
qq_423233903 小时前
C++与Python混合编程实战
开发语言·c++·算法
m0_715575343 小时前
分布式任务调度系统
开发语言·c++·算法
PfCoder3 小时前
C#中定时器之System.Timers.Timer
c#·.net·visual studio·winform
csbysj20203 小时前
选择(Selectable)
开发语言