PHP word转pdf
焚膏油以继晷,恒兀兀以穷年 人气:0方法一、使用phpword和tcpdf
1. 使用composer 安装 phpword和tcpdf
composer require phpoffice/phpword composer require tecnickcom/tcpdf
2. 示例代码 (试例框架是laravel,以下文件默认是放置在public中)
// 你的初始文件地址 $word = 'test.docx'; \PhpOffice\PhpWord\Settings::setPdfRendererPath(base_path('vendor/tecnickcom/tcpdf')); //设置转换pdf的类库名(DomPDF、MPDF、TCPDF)需要下载对应的类库 \PhpOffice\PhpWord\Settings::setPdfRendererName('TCPDF'); // 加载word文件 $wordPdf = \PhpOffice\PhpWord\IOFactory::load($word); // 读取生成的docx文件 并且指明要生成的文件格式 $pdfWriter = \PhpOffice\PhpWord\IOFactory::createWriter($wordPdf , 'PDF'); // 设置文字字体,文字大小 $pdfWriter->SetFont('wryh','',20,'',false); // 生成pdf文件 的保存地址 $temp_path = 'test.pdf' // 文件保存 $pdfWriter->save($temp_path); return $temp_path;
3. 中文乱码 - 设置字体
乱码一般是因为字体问题
1、从网上下载一个ttf文
2、找到 /vendor/tecnickcom/tcpdf/tools 的位置,将字体文件放在这个文件夹下,在此处打开窗口执行命令
php ./tcpdf_addfont.php -b -t wryh -i wryh.ttf
之后就可以在 /vendor/tecnickcom/tcpdf/fonts/ 文件夹下找到三个同名的 wryh.ctg.z,wryh.php,wryh.z文件
3、然后你在执行代码时,设置
$pdfWriter->SetFont(‘wryh’,‘’,20,‘’,false);
指明使用该字体即可。
方法二、使用unoconv将 word转pdf (Centos 8)
1. 安装libreoffice 安装libreoffice
先为安装 libreoffice 创建一个文件夹,用以保存下载的压缩包 mkdir libreoffice cd libreoffice/ # 下载 libreoffice 安装包 wget https://mirrors.cloud.tencent.com/libreoffice/libreoffice/stable/7.3.1/rpm/x86_64/LibreOffice_7.3.1_Linux_x86-64_rpm.tar.gz wget https://mirrors.cloud.tencent.com/libreoffice/libreoffice/stable/7.3.1/rpm/x86_64/LibreOffice_7.3.1_Linux_x86-64_rpm_sdk.tar.gz wget https://mirrors.cloud.tencent.com/libreoffice/libreoffice/stable/7.3.1/rpm/x86_64/LibreOffice_7.3.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz # 解压安装包 tar -zxvf LibreOffice_7.3.1_Linux_x86-64_rpm.tar.gz tar -zxvf LibreOffice_7.3.1_Linux_x86-64_rpm_sdk.tar.gz tar -zxvf LibreOffice_7.3.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz # 安装命令 yum localinstall LibreOffice_7.3.1.3_Linux_x86-64_rpm/RPMS/*.rpm yum localinstall LibreOffice_7.3.1.3_Linux_x86-64_rpm_sdk/RPMS/*.rpm yum localinstall LibreOffice_7.3.1.3_Linux_x86-64_rpm_langpack_zh-CN/RPMS/*.rpm
为 libreoffice 配置全局变量
注:要找到你安装的环境中的 libreoffice下的program的位置 vi /etc/profile # 配置文件中插入 export PATH=$PATH:/opt/libreoffice7.3/program (填写自己环境的位置) # 使环境变量生效 source /etc/profile
检查是否安装成功 :
soffice --version 能显示出来 libreoffice 的版本,则安装成功
2.安装 unoconv
centos 8 中 使用 yum 安装 unoconv 无效,所有我么使用wegt 下载压缩包,解压之后安装
wget https://github.com/unoconv/unoconv/archive/master.zip unzip master.zip cd unoconv-master/ make install
使用命令执行,使得word文件转换格式为pdf
解释: unoconv -f (你的格式) -o 新文件存储的位置 要转换的文件的位置; unoconv -f pdf -o /root/1.pdf /root/1.docx 查看新文件是否存在,确认是否转换成功
3.安装字体 (若转换的文件出现) 创建字体目录,将自己的字体文件上传至该文件夹下
mkdir -p /usr/share/fonts/win
执行以下命令,使字体生效
mkfontscale mkfontdir sudo fc-cache -fv
【报错】
若执行 mkfontscale 出现报错 mkfontscale not found
则执行下列命令
# 安装mkfontscale yum install mkfontscale # 安装fontconfig yum install fontconfig
4. 使用代码将文件转换
/** 文件格式转换 * @param $old_file 旧文件 当前项目绝对地址 * @param $new_file 新文件 当前项目中的绝对地址 * @param $file_format 指定转换的格式 */ protected static function File_conversion($old_file,$new_file,$file_format='pdf') { $old_path = public_path($old_file); $new_path = public_path($new_file); shell_exec(" unoconv -f ".$file_format." -o ".$new_path." ".$old_path); }
总结
方法一:
- 优点:操作较为简单,只需安装一些php的扩展就可以使用,
- 弊端:但是该方法只适合一些word中内容比较简单的进行转义为pdf,因为数据格式复杂之后,会容易发生文字错位的问题。
方法二:
- 优点:支持word中任何格式的数据进行转换,且不容易出现错位
- 弊端:需要在服务器中安装软件(本文已centos 8为例,讲解。)可以根据自己的需求,选择用那种方式。
- 注意 :设置字体时,最好与转换前文件中的字体一致
若上述yum命令执行的时候报错:
Error: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist
则说明是官方镜像地址被移动了,不在mirrorlist 这里了,此时我们只需执行,将地址切换到vault 去。
(阿里的镜像因为对centos8环境支持的停止,原本的镜像就被移动了。)
cd /etc/yum.repos.d/ sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
加载全部内容