Linux + PHP 实现office提取纯文本(ppt/pptx/doc/docx/xls/xlsx/pdf转txt)
1、实现思路
- php直接操作文件,遇到大的文件容易导致内存溢出,所以选用linux第三方软件
- 选用 pdftotext 提取pdf的文本内容
- 选用 libreoffice 把ppt/pptx/doc/docx/xls/xlsx 转成pdf 或 txt 文件
2、实现过程
- 软件安装
# 安装libreoffice
yum list libreoffice*
# 测试是否安装成功
soffice --version
#测试转换 /tmp/test/aa.doc 装换成 /tmp/test/aa.pdf
soffice --invisible --convert-to pdf /tmp/test/aa.doc --outdir /tmp/test
# 安装中文字体
# 从windows (C:\Windows\Fonts)复制 字体文件 到linux(/usr/share/fonts)或者子文件夹
# 如果只是文字内容提取 复制一个宋体就够用
#测试是否安装成功 如下图 有中文字体表示安装成功
fc-list :lang=zh
# 安装pdftotext 命令
yum install poppler-utils
# 测试是否安装成功
pdftotext -v
- 软件使用
pdftotext -q source.pdf convert.txt
# pdftotext -q 表示忽略错误信息
# 也可以不写入目标文件 直接返回 用 - ,如下
pdftotext -q source.pdf-
soffice --invisible --headless --norestore --nologo --convert-to pdf sourcefile.doc --outdir /tmp
# --headless 无头但根本没有用户交互
# --invisible 没有启动屏幕,没有默认文档,没有用户界面
# --norestore 禁止在出现致命错误后重新启动/还原
# --nologo 不显示启动屏幕。
#--convert-to 可以指定转换的类型,pdf,txt,html
Eg. --convert-to pdf *.doc
--convert-to pdf:writer_pdf_Export --outdir /home/user *.doc
--convert-to "html:XHTML Writer File:UTF8" *.doc
--convert-to "txt:Text (encoded):UTF8" *.doc
3、关键代码
- ppt/pptx/doc/docx/xls/xlsx (为了方便展示,特摘出关键代码,不清楚的可以随时交流)
- ppt 直接省去office转pdf的过程即可
<?php
$source = "/tmp/test/source.ppt";
$tmpDir = "/tmp/test";
// 装换pdf 设置30秒超时
$officeToPdf = "timeout 30s soffice --invisible --headless --norestore --nologo --convert-to pdf {$source} --outdir {$tmpDir}";
shell_exec($officeToPdf);
// 此时生成 与源文件同名的 /tmp/test/source.pdf
$pdfFile = $tmpDir."/"."source.pdf";
if (!file_exists($pdfFile)) {
echo "文件转换失败";
exit;
}
$pdfToTxt = "pdftotext -q {$pdfFile} -";
$content = shell_exec($pdfToTxt);
var_dump($content);