Yii框架使用组件提取PDF文件文本内容

星静酱_7884

星静酱_7884

2026-08-21

195人浏览

原创

yii框架无内置pdf文本提取功能,需用smalot/pdfparser封装为可配置组件,支持中文但不处理扫描版pdf;推荐方案是创建pdftextextractor类并注册为应用组件,避免直接new实例或误用生成类库。

yii框架使用组件提取pdf文件文本内容

Yii 框架本身不提供 PDF 文本提取功能,它没有内置的 PDF 解析器。要从 PDF 文件中提取文本内容,需借助第三方 PHP 库(如 smalot/pdfparser、setasign/fpdi 配合 tcpdf、或 spipu/html2pdf 的反向解析能力),再将其封装为 Yii 组件使用。

你真正需要的,是一个可复用、可配置、能注入到 Yii 应用生命周期中的 PDF 文本提取服务,而不是“Yii 自带组件”。


✅ 推荐方案:用 smalot/pdfparser 封装为 Yii2 组件

这是目前最轻量、稳定、支持中文(需 PDF 内含可选中文编码)且无需外部二进制依赖的纯 PHP 解决方案。

安装依赖

composer require smalot/pdfparser

创建 PDF 提取组件(@app/components/PdfTextExtractor.php)

<?php namespace app\components;

use Smalot\PdfParser\Parser;

class PdfTextExtractor
{
    public function extract($filePath): string
    {
        if (!is_file($filePath) || !is_readable($filePath)) {
            throw new \InvalidArgumentException("PDF file not found or unreadable: $filePath");
        }

        try {
            $parser = new Parser();
            $pdf    = $parser->parseFile($filePath);
            return trim($pdf->getText()); // 返回纯文本,已自动合并多页
        } catch (\Exception $e) {
            throw new \RuntimeException("Failed to parse PDF text: " . $e->getMessage(), 0, $e);
        }
    }
}

在配置中注册为应用组件(config/web.php)

'components' => [
    'pdfExtractor' => [
        'class' => 'app\components\PdfTextExtractor',
    ],
    // …其他组件
],

在控制器或服务中调用

$text = Yii::$app->pdfExtractor->extract('@webroot/uploads/invoice.pdf');
echo mb_substr($text, 0, 200) . '...'; // 示例:截取前200字

⚠️ 注意:该库无法识别扫描版 PDF(图片型)。若 PDF 是 OCR 后的图像文档,需先用 tesseract-ocr + imagick 预处理,或改用 mupdf/poppler-utils 命令行工具(需服务器支持)。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

❌ 不推荐的“伪组件”方式

  • 直接在控制器里 new Parser() 调用:破坏可测试性与复用性,不满足 Yii 组件设计初衷;
  • 试图用 yii2-export 或 mpdf 反向提取文本:它们是生成 PDF 的库,不具备解析能力;
  • 依赖 fpdi:它只负责导入已有 PDF 页面,不提供文本抽取接口。

? 中文 PDF 提取常见问题

现象 原因 解法
提取为空或乱码 PDF 使用 CID 字体但未嵌入 ToUnicode 表 尝试用 Adobe Acrobat “另存为文本”验证是否真可读;优先选用已 OCR 处理过的 PDF
报 Invalid PDF header 文件损坏或实际是 ZIP/加密文件 先用 file $path 或 head -c 10 $path 检查魔数(应为 %PDF-)
内存溢出(大 PDF) smalot/pdfparser 会加载整份结构到内存 对超 50MB 文件加 try/catch + ini_set('memory_limit', '512M'),或改用流式解析库(如 setasign/fpdi-fpdf 配合自定义解析逻辑)

? 进阶建议:对接 OCR 流程(可选)

当必须处理扫描件时,可扩展组件:

  • 判断 PDF 是否含文字层(用 $pdf->getDetails()['Pages'] 看是否有 /Contents);
  • 若无,则调用 shell_exec('pdftoppm -f 1 -l 1 -png ' . escapeshellarg($filePath) . ' /tmp/page') 截图第一页;
  • 再用 tesseract /tmp/page-1.png stdout -l chi_sim 提取中文(需提前安装 tesseract-ocr-chi-sim)。

该逻辑可封装进 PdfTextExtractor::extractWithOcr() 方法,按需启用。


不复杂但容易忽略:PDF 文本提取不是“开箱即用”的功能,关键在选对底层库 + 封装成 Yii 组件 + 明确处理边界(空页、扫描件、内存、编码)。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10704

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6261

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2135

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3948

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4674

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3651

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5237

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4102

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12042

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习

Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习