php技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > PHP编程 > php技巧 > PHP LibreOffice实现Word转PDF

使用PHP和LibreOffice实现高效Word转PDF的完整方案

作者:lskblog

在现代办公和文档处理场景中,将Word文档转换为PDF格式是一项常见需求,本文将介绍如何利用PHP和LibreOffice构建一个高效、稳定的Word转PDF解决方案,需要的朋友可以参考下

引言

在现代办公和文档处理场景中,将Word文档转换为PDF格式是一项常见需求。本文将介绍如何利用PHP和LibreOffice构建一个高效、稳定的Word转PDF解决方案,特别适合需要批量处理文档的Web应用场景。

一、技术原理概述

与常见的"Word→HTML→PDF"间接转换方式不同,本方案采用LibreOffice直接进行格式转换,具有显著优势:

二、环境准备与安装

服务器环境要求

LibreOffice安装指南

CentOS/RHEL系统安装:

# 使用yum安装
sudo yum install libreoffice libreoffice-headless

# CentOS 8及以上使用dnf
sudo dnf install libreoffice libreoffice-headless

验证安装是否成功:

libreoffice --version

PHP环境配置

确保php.ini中的disable_functions不包含exec函数:

; 编辑php.ini文件
disable_functions = ; 确保exec不在这个列表中

注意⚠️:编辑完成后需要重启PHP服务使配置即生效。

三、LibreOffice路径说明(CentOS系统)

了解LibreOffice的安装路径对于PHP脚本调用至关重要:

可以通过以下命令验证具体安装路径:

which libreoffice  # 查看可执行文件位置
rpm -ql libreoffice | grep -i "soffice$"  # 查看关键执行文件

四、完整PHP实现代码

以下是完整的Word转PDF转换类,支持单个文件和批量转换:

<?php
/**
 * 批量将Word文件转换为PDF
 * 需要服务器安装LibreOffice/OpenOffice
 */
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 convertToPdf($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: 输出目录
        $command = escapeshellcmd($this->libreOfficePath) . 
                   " --headless --convert-to pdf " . 
                   escapeshellarg($inputFile) . 
                   " --outdir " . escapeshellarg($outputDir);
        
        // 执行命令
        \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 batchConvert($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->convertToPdf($filePath, $outputDir);
        }
        
        return $results;
    }
}

// 使用示例
try {
    // 根据操作系统设置正确的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();
    
    // 设置输入和输出目录
    $inputDir = '/path/to/word/files';    // Word文件所在目录
    $outputDir = '/path/to/pdf/output';   // PDF输出目录
    
    // 批量转换
    $results = $converter->batchConvert($inputDir, $outputDir);
    
    // 输出结果
    echo "转换完成,结果如下:\n";
    foreach ($results as $result) {
        if ($result['success']) {
            echo "成功: " . $result['pdf_path'] . "\n";
        } else {
            echo "失败: " . $result['input_file'] . " - " . $result['message'] . "\n";
        }
    }
} catch (Exception $e) {
    echo "错误: " . $e->getMessage() . "\n";
}
?>

五、使用说明与注意事项

1. 路径配置

根据操作系统不同,需要调整LibreOffice的路径:

// Windows系统
$converter = new WordToPdfConverter('C:/Program Files/LibreOffice/program/soffice.exe');

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

// macOS系统
$converter = new WordToPdfConverter('/Applications/LibreOffice.app/Contents/MacOS/soffice');

2. 权限设置

确保PHP进程有足够的权限:

3. 安全性考虑

在实际生产环境中,建议:

六、性能优化建议

七、常见问题排查

结语

通过PHP结合LibreOffice实现Word到PDF的转换,提供了一个稳定、高效的文档处理解决方案。这种方法不仅保留了原始文档的格式完整性,还能满足批量处理的需求,特别适合企业级文档管理系统集成。

到此这篇关于使用PHP和LibreOffice实现高效Word转PDF的完整方案的文章就介绍到这了,更多相关PHP LibreOffice实现Word转PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文