本文目录导读:

在PHP项目中实现OCR(光学字符识别)识别,通常有几种主流方式,以下将介绍三种最实用的方案,并提供代码示例和选择建议。
使用Tesseract OCR(本地部署,免费)
Tesseract是目前最流行的开源OCR引擎,PHP通过shell命令或扩展调用它。
安装Tesseract
Ubuntu/Debian系统:
sudo apt update sudo apt install tesseract-ocr sudo apt install tesseract-ocr-chi-sim # 安装简体中文语言包
macOS:
brew install tesseract brew install tesseract-lang # 安装所有语言包
Windows:
去GitHub下载安装包:https://github.com/UB-Mannheim/tesseract/wiki
PHP调用代码
使用 exec/shell_exec(推荐)
<?php
function ocrWithTesseract($imagePath, $lang = 'chi_sim+eng') {
// 构建命令
$cmd = sprintf(
'tesseract %s stdout -l %s 2>/dev/null',
escapeshellarg($imagePath),
escapeshellarg($lang)
);
// 执行命令
$output = shell_exec($cmd);
return trim($output);
}
// 使用示例
$text = ocrWithTesseract('/path/to/image.jpg', 'chi_sim+eng');
echo $text;
?>
使用thiagoalessio/tesseract_ocr Composer包(更优雅)
composer require thiagoalessio/tesseract_ocr
<?php
require 'vendor/autoload.php';
use thiagoalessio\TesseractOCR\TesseractOCR;
$text = (new TesseractOCR('/path/to/image.jpg'))
->lang('chi_sim+eng')
->run();
echo $text;
?>
图片预处理(重要,可大幅提升准确率)
<?php
function preprocessImage($inputPath, $outputPath) {
// 使用ImageMagick或GD库进行预处理
$cmd = sprintf(
'convert %s -colorspace Gray -threshold 80%% -deskew 40%% %s',
escapeshellarg($inputPath),
escapeshellarg($outputPath)
);
exec($cmd);
// 或者使用GD库
$image = imagecreatefromjpeg($inputPath);
// 进行灰度化、二值化等处理
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagefilter($image, IMG_FILTER_CONTRAST, -50);
imagepng($image, $outputPath);
imagedestroy($image);
}
// 使用流程
$original = '/path/to/input.jpg';
$processed = '/tmp/processed.png';
preprocessImage($original, $processed);
$text = ocrWithTesseract($processed);
?>
使用云端OCR API(更准确,但需付费)
阿里云OCR
composer require alibabacloud/ocr-20191230
<?php
use AlibabaCloud\Ocr\Ocr;
require 'vendor/autoload.php';
function aliyunOCR($imagePath) {
$client = new Ocr([
'regionId' => 'cn-shanghai',
'accessKeyId' => '你的AccessKey',
'accessSecret' => '你的AccessSecret',
]);
// 读取图片并Base64编码
$imageContent = base64_encode(file_get_contents($imagePath));
$result = $client->recognizeCharacter([
'imageURL' => '', // 或使用在线图片URL
'imageBase64' => $imageContent,
]);
return $result->toArray();
}
?>
腾讯云OCR
composer require tencentcloud/tencentcloud-sdk-php
<?php
use TencentCloud\Common\Credential;
use TencentCloud\Ocr\V20181119\OcrClient;
use TencentCloud\Ocr\V20181119\Models\GeneralBasicOCRRequest;
function tencentOCR($imagePath) {
$cred = new Credential("你的SecretId", "你的SecretKey");
$client = new OcrClient($cred, "ap-guangzhou");
$req = new GeneralBasicOCRRequest();
$imageBase64 = base64_encode(file_get_contents($imagePath));
$req->ImageBase64 = $imageBase64;
$resp = $client->GeneralBasicOCR($req);
return json_decode($resp->toJsonString(), true);
}
?>
Google Cloud Vision API
composer require google/cloud-vision
<?php
use Google\Cloud\Vision\V1\ImageAnnotatorClient;
function googleOCR($imagePath) {
$imageAnnotator = new ImageAnnotatorClient([
'keyFilePath' => '/path/to/service-account-key.json'
]);
$image = file_get_contents($imagePath);
$response = $imageAnnotator->textDetection($image);
$texts = $response->getTextAnnotations();
if ($texts->count() > 0) {
return $texts[0]->getDescription();
}
return '';
}
?>
使用OCR.space API(免费额度,简单易用)
<?php
function ocrSpace($imagePath, $apiKey = 'helloworld') {
$curlFile = new CURLFile($imagePath);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.ocr.space/parse/image');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'apikey' => $apiKey,
'language' => 'chs', // 中文
'file' => $curlFile,
'OCREngine' => 2, // 2表示使用更准确的引擎
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
$data = json_decode($result, true);
if ($data['OCRExitCode'] == 1) {
return $data['ParsedResults'][0]['ParsedText'];
}
return null;
}
// 使用
$text = ocrSpace('/path/to/image.jpg');
echo $text;
?>
方案选择建议
| 方案 | 成本 | 准确率 | 速度 | 推荐场景 |
|---|---|---|---|---|
| Tesseract | 免费 | 中等(70-85%) | 较快 | 简单文档、清晰印刷体 |
| 阿里云/腾讯云 | 按量付费 | 高(90-98%) | 快 | 正式项目、复杂场景 |
| Google Vision | 有免费额度 | 最高 | 快 | 多语言、复杂背景 |
| OCR.space | 免费(有限制) | 较高 | 中等 | 测试、小项目 |
实战建议
完整的文件上传+OCR处理示例
<?php
// upload_ocr.php
require 'vendor/autoload.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
$uploadDir = '/tmp/uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
$filename = uniqid() . '.' . pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
$filePath = $uploadDir . $filename;
if (move_uploaded_file($_FILES['image']['tmp_name'], $filePath)) {
// 1. 预处理图片
$processedPath = $uploadDir . 'processed_' . $filename;
preprocessImage($filePath, $processedPath);
// 2. 执行OCR
$text = ocrWithTesseract($processedPath, 'chi_sim+eng');
// 3. 清理临时文件
unlink($filePath);
unlink($processedPath);
echo json_encode([
'success' => true,
'text' => $text
]);
}
}
?>
错误处理和多引擎降级策略
<?php
class OCRService {
private $engines = [];
public function recognize($imagePath) {
// 尝试不同引擎,从高准确率到低准确率
$engines = [
[$this, 'recognizeWithAliyun'],
[$this, 'recognizeWithTesseract'],
];
foreach ($engines as $engine) {
try {
$result = call_user_func($engine, $imagePath);
if (!empty($result)) {
return $result;
}
} catch (Exception $e) {
// 记录错误,继续下一个引擎
error_log("OCR failed: " . $e->getMessage());
continue;
}
}
return null;
}
}
?>
注意事项
- 图片质量:OCR准确率与图片质量直接相关,确保图片清晰、光线均匀
- 语言包:中文识别必须安装中文语言包,多语言混合场景推荐同时使用中英文
- 性能:Tesseract处理大图可能较慢,建议先压缩图片(宽高不超过2000px)
- 安全性:使用exec时要谨慎,确保对用户输入进行严格转义
- 合规性:使用商业API时,注意数据隐私和合规要求
选择哪种方案取决于你的项目预算、准确率要求和部署环境,对于生产环境,推荐使用云端API配合Tesseract作为备选方案。