使用PHP将Word文件转换为PDF文件的三种方式
发布:smiling 来源: PHP粉丝网 添加日期:2026-07-15 17:40:40 浏览: 评论:0
本文介绍了三种将Word文件转换为PDF文件的方法:PHPWord+Dompdf、LibreOffice命令和SphinxSearch扩展,详细介绍了每种方法的适用场景和安装配置步骤,最后还解决了转换过程中可能出现的中文乱码问题,需要的朋友可以参考下
最近工作中遇到了需要把word文件转换为pdf文件功能,尝试了几种方式,在此记录一下,供大家参考。
环境准备:
服务器:CentOS 7.8
PHP:7.2
一、 使用 PHPWord + Dompdf(纯 PHP,无需系统软件,推荐轻量场景)
或使用mpdf或者tcpdf都可以,原理就是获取word文件的内容,并转换为html,并将html转换成pdf。适合简单 Word 文档(.docx),无复杂格式、图片、表格。对于复杂word文件,不推荐此种方式。
1. 安装依赖
composer require phpoffice/phpword
composer require dompdf/dompdf
2. 转换代码
- <?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 密钥并安装仓库配置:
sudo rpm --import https://rpmfusion.org/keys?action=AttachFile&do=get&target=RPM-GPG-KEY-rpmfusion-free-centos-8
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 仓库
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:
sudo yum install snapd
sudo systemctl enable --now snapd.socket
安装LibreOffice
sudo snap install libreoffice --classic
2. 转换代码
确保 PHP 能执行 exec/shell_exec 函数
- <?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
- $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进行转换,大家还有哪些好方法,欢迎留言讨论。
Tags: PHP将Word文件转换为PDF文件
- 上一篇:如何在PHP中处理CSV、Excel文件导入导出详解
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
