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进行转换,大家还有哪些好方法,欢迎留言讨论。

相关推荐
cch89183 小时前
PHP vs Java:谁更适合你的项目?
java·开发语言·php
攻城狮的梦3 小时前
线上接收附件回调超时排查复现
开发语言·php·lavarel
Linux运维技术栈3 小时前
微软(Microsoft 365) 自定义域名企业邮件系统全流程通用配置手册
microsoft·php·邮件系统
jwn9994 小时前
Laravel2.x经典特性回顾
开发语言·php·laravel
喵了几个咪4 小时前
Go 语言 CMS 横评:风行 GoWind 对比传统 PHP/Java CMS 核心优势
java·golang·php
TE-茶叶蛋4 小时前
使用FlyEnv启动PHP项目
开发语言·php
fzb5QsS1p1 天前
告别重复造轮子,Qt 快速开发脚手架
开发语言·qt·php
取码网1 天前
最新临时文件快传系统源码 轻量化 带后台
php
彧翎Pro1 天前
ASP.NET Core 外部依赖调用治理实战:HttpClientFactory、Polly 与幂等边界
microsoft·asp.net·php