PHP通过PDFParser解析PDF文件
之前一直找到的资料都是教你怎么生成pdf文档,比如:TCPDF、FPDF、wkhtmltopdf。而我碰到的项目里需要验证从远程获取的pdf文件是否受损、文件内容是否一致这些问题,这些都不能直接提供给我读取pdf的功能,碰巧找到了一个可以读取并解析PDF文档的第三方类库PDFParser,该类库非常简单好用,可以直奔官网了解。
一、安装步骤
我这里用的是CI框架,但都可用composer包管理方式安装到项目中,进行开发调用
- 将PDFParser加入composer.json文件中
- 项目根目录下打开命令行并执行:
composer update smalot/pdfparser
如果发现update不下来,可以修改当前项目的 composer.json 配置文件,打开命令行窗口(windows用户)或控制台(Linux、Mac 用户),进入你的项目的根目录(也就是 composer.json 文件所在目录),执行如下命令:
composer config repo.packagist composer https://packagist.phpcomposer.com
,再重试。当然,如果本地没安装composer,请前往composer官网自行安装。
二、示例代码
- 读取pdf文件内容、获取文件详情
//引入pdf解析第三方类库
$vendorAutoloadFile = APPPATH.'..'.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';
require_once($vendorAutoloadFile);
$pdfFile = '/temp/label/HnEms/LS955518275CN.pdf';
//读取pdf,验证跟踪号是否一致
// Parse pdf file and build necessary objects.
$parser = new \Smalot\PdfParser\Parser();
$pdfPath = $_SERVER['DOCUMENT_ROOT'].$pdfFile;
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText();
echo $text;
echo '<hr>';
// Retrieve all details from the pdf file.
$details = $pdf->getDetails();
var_dump($details);
die;
执行结果展示:
三、实践应用
这里验证pdf文档中跟踪号是否和提供的一致,不一致返回假,若pdf是损坏的则返回false。函数也提供了返回异常消息。
$trackingNumber = 'LS955518275CN';
$pdfFile = '/temp/label/Chukou1/3559675.pdf';
//仅验证pdf文件是否有效
//$result = verifyValidLabelPdf($trackingNumber, $pdfFile);
//验证pdf是否有效,无效则返回无效的原因
$result = verifyValidLabelPdf($trackingNumber, $pdfFile, true);
var_dump($result);
/**
* 验证面单pdf文件是否完整(文件不存在、损坏和跟踪号不一致等情况)
* @param string $trackingNumber 跟踪号
* eg. $trackingNumber = 'LS955518275CN';
* @param string $pdfFile pdf文件路径
* @param bool $showExceptionMessage 默认为false,不返回异常消息,为true时,出现异常会返回异常消息
* @return bool true pdf有效,false pdf无效
*
* Attention please : 该方法异常处理千万不要去掉,第三方类库PdfParser解析PDF出错时会抛异常,
* 这里的异常处理也可以接收PdfParser抛出来的异常信息,进行友好提示
*/
function verifyValidLabelPdf($trackingNumber, $pdfFile, $showExceptionMessage = false)
{
try{
$pdfPath = $_SERVER['DOCUMENT_ROOT'].$pdfFile;
//验证文件是否存在
if (!file_exists($pdfPath) || !is_file($pdfPath)){
throw new Exception('pdf文件不存在');
}
//引入PdfParser第三方类库
$vendorAutoloadFile = APPPATH.'..'.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';
require_once($vendorAutoloadFile);
//读取pdf,验证跟踪号是否一致
// Parse pdf file and build necessary objects.
$parser = new \Smalot\PdfParser\Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText();
//验证跟踪号是否一致
if (strpos($text, $trackingNumber) === false){
throw new Exception('跟踪号不一致');
}
return true;
}catch (Exception $ex){
//获取错误类型 pdf文件可能不存在、损坏等无法加载
if ($showExceptionMessage === true){
//接收异常提示消息并返回
$message = $ex->getMessage();
return $message;
}
return false;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义