本文目录导读:

使用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引擎或云服务,这是最稳妥、高效的方法。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播