本文目录导读:

使用PHP实现票据识别,通常有两种主流方案:
- 调用第三方OCR API(推荐,最省力)
- 集成开源OCR引擎(如Tesseract)
由于PHP本身不具备图像识别能力,方案一(云API) 是绝大多数PHP项目的选择,它识别率高、支持全票种,且不需要自己训练模型。
以下是详细的实现指南:
调用第三方OCR API(推荐)
这是目前最成熟的方案,腾讯、阿里、百度都提供专门针对增值税发票、火车票、出租车票等票据的识别接口。
总体流程
- 用户上传票据图片(拍照或截图)。
- 后端PHP脚本接收文件。
- PHP将图片发送给OCR平台API。
- 平台返回JSON格式的识别结果(发票号码、金额、日期等)。
- PHP解析JSON并存入数据库或返回给前端。
代码示例(以百度AI为例)
百度云提供了通用的票据识别API,支持增值税发票、火车票、机票行程单等。
第一步:准备工作
- 去 百度AI官网 创建应用,获取
API Key和Secret Key。 - 使用
composer安装SDK:composer require baidu-aip/php-sdk
第二步:PHP代码实现
<?php
require_once 'vendor/autoload.php';
use AipOcr;
// 1. 配置百度AI应用的常量
const APP_ID = '你的AppID';
const API_KEY = '你的API Key';
const SECRET_KEY = '你的Secret Key';
$client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
// 2. 接收上传的图片
if ($_FILES['receipt']['error'] == UPLOAD_ERR_OK) {
$filePath = $_FILES['receipt']['tmp_name'];
$image = file_get_contents($filePath);
// 3. 调用接口 - 增值税发票识别
// 可根据需要换用 accurateBasic(通用文字)、vatInvoice(增值税发票)等
$result = $client->vatInvoice($image);
// 4. 处理识别结果
if (isset($result['words_result'])) {
$invoiceData = $result['words_result'];
echo "<pre>";
echo "发票号码:" . ($invoiceData['InvoiceNum'] ?? 'N/A') . PHP_EOL;
echo "发票代码:" . ($invoiceData['InvoiceCode'] ?? 'N/A') . PHP_EOL;
echo "开票日期:" . ($invoiceData['InvoiceDate'] ?? 'N/A') . PHP_EOL;
echo "合计金额:" . ($invoiceData['TotalAmount'] ?? 'N/A') . PHP_EOL;
echo "含税金额:" . ($invoiceData['AmountInWords'] ?? 'N/A') . PHP_EOL;
echo "</pre>";
// 这里可以将数据存入MySQL数据库
// insert into invoices(...) values(...);
} else {
echo "识别失败:" . print_r($result, true);
}
}
?>
前端HTML(用于上传)
<form action="process.php" method="post" enctype="multipart/form-data">
<input type="file" name="receipt" accept="image/*" required>
<button type="submit">识别票据</button>
</form>
其他云厂商对比
| 厂商 | 适合接口 | 特点 |
|---|---|---|
| 腾讯云 | OCR 票据识别 |
支持全票种(发票、小票、行程单),接入简单。 |
| 阿里云 | 文字识别 > 票据凭证识别 |
功能最全,支持定额/出租车/火车票等。 |
| 百度AI | 增值税发票识别 / 通用票据识别 |
免费额度多,文档中文友好。 |
使用Tesseract OCR(开源、免费,但精度较低)
如果你的项目预算有限,且数据量不大(偶尔识别几张字迹清晰的票据),可以尝试Tesseract。
安装Tesseract
在Linux服务器上安装:
sudo apt-get install tesseract-ocr sudo apt-get install tesseract-ocr-chi-sim # 中文语言包
PHP调用(通过 exec 命令)
<?php
$imagePath = '/tmp/receipt.jpg';
$outputPath = '/tmp/output.txt';
// 调用系统命令
exec("tesseract {$imagePath} {$outputPath} -l chi_sim+eng 2>&1", $output, $return_var);
if ($return_var === 0) {
$result = file_get_contents($outputPath . '.txt');
echo "识别结果(纯文本,无结构化):<br><pre>" . htmlspecialchars($result) . "</pre>";
} else {
echo "识别失败:<br>" . print_r($output, true);
}
?>
缺点:
- 结果未结构化: 返回的是纯文本,需要自己写正则从字符串中提取发票号码、金额、日期。
/发票号码[::](\d+)/。 - 识别率低: 对红色印章、模糊图片、倾斜图片处理能力不如云端API。
- 部署复杂: 服务器需要安装Tesseract及中文语言包,且不能用于虚拟主机等受限环境。
容器化/微服务架构(进阶)
如果你的PHP项目是大型SaaS,对响应速度要求极高:
- 将图像识别模块独立出来,用Python(PaddleOCR)或Java实现一个微服务。
- PHP项目通过HTTP(Guzzle HTTP客户端)或消息队列(RabbitMQ)调用这个微服务。
- 微服务处理完图片后,将结构化的JSON返回给PHP。
选型建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 企业级应用(财务系统、报销系统) | 百度/腾讯/阿里云API | 识别率高(99%+),支持字段结构化,省去自己写正则的麻烦。 |
| 个人开源项目或 演示Demo | Tesseract | 零成本,简单快速。 |
| 高并发、高定制化(自研识别模型) | Python微服务 + PHP调用 | 可以利用PaddleOCR等顶级开源模型,控制成本。 |
常见问题与优化
- 图片太大导致API调用失败?
对上传的图片进行压缩或缩放(使用GD或Imagick库),通常1000px宽度足够,文件大小控制在2MB以内。 - 识别结果乱码(中文不显示)?
确保PHP脚本和数据库连接使用UTF-8编码,调用API时,图片尽量保持JPEG格式。 - 网络超时?
使用guzzlehttp/guzzle设置合理的超时时间(10-30秒)。 - 并发限制?
云API有QPS限制(例如百度免费版2QPS),如果需要大量识别,可以使用消息队列(Redis + queue)进行削峰填谷。
核心要点总结: 不要尝试在PHP内写图像算法。PHP的角色是文件接收、调用API、存储结果,识别部分交给专业的OCR引擎或云服务,这是最稳妥、高效的方法。