如何用PHP项目实现票据识别?

wen java案例 1

本文目录导读:

如何用PHP项目实现票据识别?

  1. 方案一:调用第三方OCR API(推荐)
  2. 方案二:使用Tesseract OCR(开源、免费,但精度较低)
  3. 方案三:容器化/微服务架构(进阶)
  4. 选型建议
  5. 常见问题与优化

使用PHP实现票据识别,通常有两种主流方案:

  1. 调用第三方OCR API(推荐,最省力)
  2. 集成开源OCR引擎(如Tesseract)

由于PHP本身不具备图像识别能力,方案一(云API) 是绝大多数PHP项目的选择,它识别率高、支持全票种,且不需要自己训练模型。

以下是详细的实现指南:


调用第三方OCR API(推荐)

这是目前最成熟的方案,腾讯、阿里、百度都提供专门针对增值税发票、火车票、出租车票等票据的识别接口。

总体流程

  1. 用户上传票据图片(拍照或截图)。
  2. 后端PHP脚本接收文件。
  3. PHP将图片发送给OCR平台API。
  4. 平台返回JSON格式的识别结果(发票号码、金额、日期等)。
  5. PHP解析JSON并存入数据库或返回给前端。

代码示例(以百度AI为例)

百度云提供了通用的票据识别API,支持增值税发票、火车票、机票行程单等。

第一步:准备工作

  • 百度AI官网 创建应用,获取 API KeySecret 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,对响应速度要求极高:

  1. 图像识别模块独立出来,用Python(PaddleOCR)或Java实现一个微服务。
  2. PHP项目通过HTTP(Guzzle HTTP客户端)或消息队列(RabbitMQ)调用这个微服务。
  3. 微服务处理完图片后,将结构化的JSON返回给PHP。

选型建议

场景 推荐方案 原因
企业级应用(财务系统、报销系统) 百度/腾讯/阿里云API 识别率高(99%+),支持字段结构化,省去自己写正则的麻烦。
个人开源项目演示Demo Tesseract 零成本,简单快速。
高并发、高定制化(自研识别模型) Python微服务 + PHP调用 可以利用PaddleOCR等顶级开源模型,控制成本。

常见问题与优化

  1. 图片太大导致API调用失败?
    对上传的图片进行压缩或缩放(使用 GDImagick 库),通常1000px宽度足够,文件大小控制在2MB以内。
  2. 识别结果乱码(中文不显示)?
    确保PHP脚本和数据库连接使用 UTF-8 编码,调用API时,图片尽量保持JPEG格式。
  3. 网络超时?
    使用 guzzlehttp/guzzle 设置合理的超时时间(10-30秒)。
  4. 并发限制?
    云API有QPS限制(例如百度免费版2QPS),如果需要大量识别,可以使用消息队列(Redis + queue)进行削峰填谷。

核心要点总结: 不要尝试在PHP内写图像算法。PHP的角色是文件接收、调用API、存储结果,识别部分交给专业的OCR引擎或云服务,这是最稳妥、高效的方法。

抱歉,评论功能暂时关闭!