Linux + PHP 实现office提取纯文本(ppt/pptx/doc/docx/xls/xlsx/pdf转txt)

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);

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你回答这个问题。首先需要获取到android11以上的存储权限,然后使用Storage Access Framework(SAF)来遍历文件。接着,我们可以使用DocumentFile API来过滤出指定类型的文件,最后使用lod.d来打印文件内容。 以下是一个示例代码: ```java // 获取存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); return; } // 打开SAF文件选择器 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, 2); // 在onActivityResult中处理文件选择结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 2 && resultCode == RESULT_OK) { Uri treeUri = data.getData(); DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri); // 遍历文件并打印 for (DocumentFile file : pickedDir.listFiles()) { String fileName = file.getName(); if (fileName.endsWith(".txt") || fileName.endsWith(".doc") || fileName.endsWith(".docx") || fileName.endsWith(".pdf") || fileName.endsWith(".ppt") || fileName.endsWith(".pptx") || fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) { try { InputStream inputStream = getContentResolver().openInputStream(file.getUri()); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { stringBuilder.append(line); } Log.d("FileContents", stringBuilder.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 请注意,上述代码仅供参考,并且可能需要根据您的实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值