PHP将Word文件转换为PDF文件的三种方式,以及中文乱码解决

目录

[一、 使用 PHPWord + Dompdf(纯 PHP,无需系统软件,推荐轻量场景)](#一、 使用 PHPWord + Dompdf(纯 PHP,无需系统软件,推荐轻量场景))

[1. 安装依赖](#1. 安装依赖)

[2. 转换代码](#2. 转换代码)

[二、调用 LibreOffice 命令(最稳定,支持复杂 Word,生产环境首选)](#二、调用 LibreOffice 命令(最稳定,支持复杂 Word,生产环境首选))

[1. 安装 LibreOffice:](#1. 安装 LibreOffice:)

[1.1 使用EPEL库安装](#1.1 使用EPEL库安装)

[1.2 使用 RPM Fusion 仓库](#1.2 使用 RPM Fusion 仓库)

[1.3 使用官方 LibreOffice 仓库](#1.3 使用官方 LibreOffice 仓库)

[1.4 使用 Snap 包管理器(如果你)](#1.4 使用 Snap 包管理器(如果你))

[2. 转换代码](#2. 转换代码)

[三、使用 SphinxSearch 扩展(UNIX 系统专用,性能强)](#三、使用 SphinxSearch 扩展(UNIX 系统专用,性能强))

[1. 安装unoconv](#1. 安装unoconv)

[1.1 安装 EPEL 仓库](#1.1 安装 EPEL 仓库)

[1.2 安装unoconv](#1.2 安装unoconv)

[1.3 确认安装](#1.3 确认安装)

[2. 转换代码](#2. 转换代码)

[3. 中文乱码解决](#3. 中文乱码解决)

[‌3.1 下载中文字体‌](#‌3.1 下载中文字体‌)

[3‌.2 将字体文件复制到字体目录‌](#3‌.2 将字体文件复制到字体目录‌)

[‌3.3 更新字体缓存‌](#‌3.3 更新字体缓存‌)


最近工作中遇到了需要把word文件转换为pdf文件功能,尝试了几种方式,在此记录一下,供大家参考。

环境准备:

服务器:CentOS 7.8

PHP:7.2

一、 使用 PHPWord + Dompdf(纯 PHP,无需系统软件,推荐轻量场景)

或使用mpdf或者tcpdf都可以,原理就是获取word文件的内容,并转换为html,并将html转换成pdf。适合简单 Word 文档(.docx),无复杂格式、图片、表格。对于复杂word文件,不推荐此种方式。

1. 安装依赖​​​​​​​

bash 复制代码
composer require phpoffice/phpword
composer require dompdf/dompdf

2. 转换代码​​​​​​​

php 复制代码
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpWord\IOFactory;
use Dompdf\Dompdf;
// 输入 Word 路径
$wordPath = 'test.docx';
// 输出 PDF 路径
$pdfPath = 'output.pdf';
try {
    // 1. 读取 Word
    $phpWord = IOFactory::load($wordPath);
    // 2. 先渲染为 HTML
    $htmlWriter = IOFactory::createWriter($phpWord, 'HTML');
    $html = $htmlWriter->getContent();
    // 3. 使用 Dompdf 转 PDF
    $dompdf = new Dompdf();
    $dompdf->loadHtml($html);
    $dompdf->setPaper('A4', 'portrait');
    $dompdf->render();
    // 4. 保存 PDF
    file_put_contents($pdfPath, $dompdf->output());
    echo "转换成功!PDF 已保存到:$pdfPath";
} catch (Exception $e) {
    echo "转换失败:" . $e->getMessage();
}

二、调用 LibreOffice 命令(最稳定,支持复杂 Word,生产环境首选)

适合复杂 Word (带图片、表格、样式、公式、.doc/.docx),格式还原度最高。Windows/Linux 服务器都能用。

1. 安装 LibreOffice:

1.1 使用EPEL库安装

复制代码
sudo yum install epel-release

安装 LibreOffice

复制代码
sudo yum install libreoffice

1.2 使用 RPM Fusion 仓库

导入 RPM Fusion 的 GPG 密钥并安装仓库配置:​​​​​​​

bash 复制代码
sudo rpm --import https://rpmfusion.org/keys?action=AttachFile&do=get&target=RPM-GPG-KEY-rpmfusion-free-centos-8
bash 复制代码
sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %centos).noarch.rpm

安装LibreOffice

复制代码
sudo yum install libreoffice-core

1.3 使用官方 LibreOffice 仓库

下载并安装 LibreOffice 的 YUM 仓库配置文件:

复制代码
sudo rpm -Uvh https://download.documentfoundation.org/libreoffice/stable/6.4.7/rpm/x86_64/libreoffice6.4.7-lp180103.x86_64.rpm

安装LibreOffice

复制代码
sudo yum install libreoffice-core

1.4 使用 Snap 包管理器(如果你)

使用的是 CentOS 8 或更高版本,CentOS 版本支持 Snap

启用 EPEL 和 PowerTools 仓库​​​​​​​

bash 复制代码
sudo yum install epel-release
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo yum install centos-release-powertools

安装 Snapd‌:​​​​​​​

bash 复制代码
sudo yum install snapd
sudo systemctl enable --now snapd.socket

安装LibreOffice

复制代码
sudo snap install libreoffice --classic

2. 转换代码

确保 PHP 能执行 exec/shell_exec 函数​​​​​​​

php 复制代码
<?php
// Word 路径
$wordFile = __DIR__ . '/test.docx';
// 输出目录
$outputDir = __DIR__;
// Windows 下 LibreOffice 安装路径(改成你自己的)
$libreOffice = 'C:\Program Files\LibreOffice\program\soffice.exe';
// Linux 路径
// $libreOffice = '/usr/bin/libreoffice';
// 转换命令
$command = sprintf(
    '"%s" --headless --convert-to pdf --outdir "%s" "%s"',
    $libreOffice,
    $outputDir,
    $wordFile
);
// 执行转换
exec($command, $output, $status);
if ($status === 0) {
    echo "转换成功!PDF 保存在:$outputDir";
} else {
    echo "转换失败";
    print_r($output);
}

格式还原度 99%,支持 .doc/.docx/wps 文档

三、使用 SphinxSearch 扩展(UNIX 系统专用,性能强)

适合Linux 服务器,大量文档批量转换。需要安装 unoconv + LibreOffice。

1. 安装unoconv

在 CentOS 上安装unoconv和它的依赖项,通常需要使用一些额外的软件包,因为 CentOS 默认的仓库中不包含 unoconv,可以通过以下步骤安装:

1.1 安装 EPEL 仓库

参考 方法二 安装 LibreOffice

1.2 安装unoconv

一旦安装了 EPEL 仓库和 LibreOffice,你就可以通过 pip 安装 unoconv 了。首先,确保你的系统已经安装了 Python 和 pip。你可以通过以下命令安装 pip(如果尚未安装):

复制代码
sudo yum install python3-pip

然后使用pip安装unoconv:

复制代码
pip3 install unoconv

1.3 确认安装

复制代码
unoconv --version

如果这个命令返回了版本信息,那么 unoconv 就已经成功安装了。

2. 转换代码

安装成功后,就可以开始转换文件了,转换命令:

复制代码
unoconv -f pdf -o 转换后的pdf文件地址 word文件地址
php 复制代码
<?php
$word = 'test.docx';
$pdf = 'output.pdf';
exec("unoconv -f pdf $pdf $word");
if (file_exists($pdf)) {
    echo "转换成功";
}

3. 中文乱码解决

CentOS系统默认是不安装中文字体的,如果系统中没有中文字体,word转换成pdf文件后,中文会显示为乱码,需要安装中文字体来解决。

‌3.1 下载中文字体‌

从互联网上下载你需要的中文字体文件(通常是 .ttf 或 .otf 文件)。

这里已经为大家准备好了一些字体,里面有我自己用的,也有网上分享的:https://pan.quark.cn/s/051c9ef67a4f

大家也可以自己到网上搜索一些免费字体使用。

3‌.2 将字体文件复制到字体目录‌

将下载的字体文件复制到系统的字体目录中,通常是 /usr/share/fonts/ 或 /usr/share/fonts/chinese/。如下图所示:

‌3.3 更新字体缓存‌

更新字体缓存,使系统能够识别新安装的字体:

复制代码
sudo fc-cache -fv

字体库安装之后,再次转换,中文就会显示正常。

本人使用的是unoconv进行转换,大家还有哪些好方法,欢迎留言讨论。

相关推荐
BingoGo2 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack2 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982072 天前
PHP 扩展——从入门到理解
php
鹏仔先生3 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip3 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒4 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2504 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis4 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
Cheng小攸4 天前
渗透行为分析与检测
开发语言·php