本文目录导读:

我来详细介绍PHP项目对接OCR文字识别接口的几种主流方案和实现步骤。
主流OCR接口服务
百度云OCR
<?php
// 使用百度云OCR API
require_once 'AipOcr.php'; // 百度提供的SDK
class BaiduOCRService {
private $client;
public function __construct() {
$this->client = new AipOcr(
'你的AppID',
'你的API Key',
'你的Secret Key'
);
}
// 通用文字识别
public function generalText($imagePath) {
$image = file_get_contents($imagePath);
$result = $this->client->basicGeneral($image);
return $result;
}
// 高精度识别
public function accurateText($imagePath) {
$image = file_get_contents($imagePath);
$result = $this->client->basicAccurate($image);
return $result;
}
}
腾讯云OCR
<?php
require_once './vendor/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Ocr\V20181119\OcrClient;
use TencentCloud\Ocr\V20181119\Models\GeneralBasicOCRRequest;
class TencentOCRService {
private $client;
public function __construct() {
$cred = new Credential("你的SecretId", "你的SecretKey");
$this->client = new OcrClient($cred, "ap-guangzhou");
}
// 通用文字识别
public function generalText($imagePath) {
$req = new GeneralBasicOCRRequest();
// 支持Base64或URL方式
$image = base64_encode(file_get_contents($imagePath));
$req->setImageBase64($image);
$resp = $this->client->GeneralBasicOCR($req);
return json_decode($resp->toJsonString(), true);
}
}
阿里云OCR
<?php
require_once './vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
class AliyunOCRService {
public function recognize($imagePath) {
AlibabaCloud::accessKeyClient(
'你的AccessKeyId',
'你的AccessKeySecret'
)->regionId('cn-shanghai')->asDefaultClient();
try {
$result = AlibabaCloud::rpc()
->product('ocr')
->scheme('https')
->version('2019-12-30')
->action('RecognizeCharacter')
->method('POST')
->options([
'query' => [
'ImageURL' => $imagePath, // 图片URL地址
],
])
->request();
return $result->toArray();
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
}
}
}
通用对接方案
封装统一的OCR服务接口
<?php
interface OCRServiceInterface {
public function recognize($imagePath);
public function recognizeFromUrl($imageUrl);
public function recognizeFromBase64($base64Image);
}
class OCRServiceManager {
private $service;
public function __construct($provider = 'baidu') {
switch ($provider) {
case 'baidu':
$this->service = new BaiduOCRService();
break;
case 'tencent':
$this->service = new TencentOCRService();
break;
case 'aliyun':
$this->service = new AliyunOCRService();
break;
default:
throw new Exception("Unsupported OCR provider");
}
}
public function recognize($imagePath) {
return $this->service->recognize($imagePath);
}
}
通用HTTP请求封装
<?php
class HTTPOCRClient {
private $apiUrl;
private $apiKey;
public function __construct($apiUrl, $apiKey) {
$this->apiUrl = $apiUrl;
$this->apiKey = $apiKey;
}
public function recognize($imagePath) {
$ch = curl_init();
// 构建请求数据
$postData = [
'image' => new CURLFile($imagePath),
'api_key' => $this->apiKey
];
curl_setopt_array($ch, [
CURLOPT_URL => $this->apiUrl,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 30
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new Exception("API request failed with code: $httpCode");
}
return json_decode($response, true);
}
}
对接实例 - 完整项目结构
项目目录
ocr-project/
├── src/
│ ├── Services/
│ │ ├── OCRServiceInterface.php
│ │ ├── BaiduOCRService.php
│ │ ├── TencentOCRService.php
│ │ └── OCRServiceManager.php
│ ├── Utils/
│ │ └── ImageProcessor.php
│ └── Controllers/
│ └── OCRController.php
├── config/
│ └── ocr.php
├── public/
│ └── index.php
└── composer.json
配置文件
<?php
// config/ocr.php
return [
'default' => 'baidu',
'providers' => [
'baidu' => [
'app_id' => 'your_app_id',
'api_key' => 'your_api_key',
'secret_key' => 'your_secret_key',
'base_url' => 'https://aip.baidubce.com'
],
'tencent' => [
'secret_id' => 'your_secret_id',
'secret_key' => 'your_secret_key',
'region' => 'ap-guangzhou'
],
'aliyun' => [
'access_key_id' => 'your_access_key_id',
'access_key_secret' => 'your_access_key_secret'
]
]
];
控制器示例
<?php
// src/Controllers/OCRController.php
class OCRController {
private $ocrService;
public function __construct() {
$config = include '../config/ocr.php';
$this->ocrService = new OCRServiceManager($config['default']);
}
// 处理图片上传和识别
public function recognizeImage() {
try {
if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) {
throw new Exception("文件上传失败");
}
$imagePath = $_FILES['image']['tmp_name'];
$result = $this->ocrService->recognize($imagePath);
// 处理结果
$text = $this->extractText($result);
return [
'success' => true,
'text' => $text,
'raw_result' => $result
];
} catch (Exception $e) {
return [
'success' => false,
'error' => $e->getMessage()
];
}
}
private function extractText($result) {
// 根据不同服务商解析结果
$text = '';
if (isset($result['words_result'])) {
foreach ($result['words_result'] as $item) {
$text .= $item['words'] . "\n";
}
}
return $text;
}
}
前端页面
<!-- public/index.php -->
<!DOCTYPE html>
<html>
<head>OCR文字识别</title>
<style>
.container { max-width: 800px; margin: 50px auto; }
#result { margin-top: 20px; padding: 15px; border: 1px solid #ccc; }
.loading { display: none; }
</style>
</head>
<body>
<div class="container">
<h1>OCR文字识别</h1>
<form id="ocrForm" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*" required>
<button type="submit">识别</button>
</form>
<div class="loading">识别中...</div>
<div id="result"></div>
</div>
<script>
document.getElementById('ocrForm').onsubmit = async function(e) {
e.preventDefault();
const formData = new FormData(this);
const resultDiv = document.getElementById('result');
const loadingDiv = document.querySelector('.loading');
loadingDiv.style.display = 'block';
resultDiv.innerHTML = '';
try {
const response = await fetch('recognize.php', {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.success) {
resultDiv.innerHTML = `<pre>${data.text}</pre>`;
} else {
resultDiv.innerHTML = `错误: ${data.error}`;
}
} catch (error) {
resultDiv.innerHTML = `请求失败: ${error.message}`;
} finally {
loadingDiv.style.display = 'none';
}
};
</script>
</body>
</html>
最佳实践建议
图片预处理
<?php
class ImageProcessor {
// 压缩图片
public static function compress($sourcePath, $maxWidth = 1024) {
list($width, $height) = getimagesize($sourcePath);
if ($width > $maxWidth) {
$ratio = $maxWidth / $width;
$newWidth = $maxWidth;
$newHeight = $height * $ratio;
$sourceImage = imagecreatefromstring(file_get_contents($sourcePath));
$newImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0,
$newWidth, $newHeight, $width, $height);
imagejpeg($newImage, $sourcePath, 90);
imagedestroy($sourceImage);
imagedestroy($newImage);
}
}
// 图片转灰度
public static function toGrayscale($sourcePath) {
$image = imagecreatefromstring(file_get_contents($sourcePath));
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagejpeg($image, $sourcePath);
imagedestroy($image);
}
}
错误处理与重试机制
<?php
class RetryHandler {
public static function execute($callback, $maxRetries = 3, $delay = 1) {
$attempts = 0;
while ($attempts < $maxRetries) {
try {
return $callback();
} catch (Exception $e) {
$attempts++;
if ($attempts >= $maxRetries) {
throw $e;
}
sleep($delay);
}
}
}
}
// 使用示例
$result = RetryHandler::execute(function() use ($ocrService, $imagePath) {
return $ocrService->recognize($imagePath);
});
缓存优化
<?php
class OCRCache {
private $cacheDir = './cache/ocr/';
public function get($imageHash) {
$cacheFile = $this->cacheDir . $imageHash . '.json';
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 86400)) {
return json_decode(file_get_contents($cacheFile), true);
}
return null;
}
public function set($imageHash, $result) {
if (!is_dir($this->cacheDir)) {
mkdir($this->cacheDir, 0777, true);
}
file_put_contents(
$this->cacheDir . $imageHash . '.json',
json_encode($result)
);
}
}
这些方案可以帮助你快速集成OCR功能到PHP项目中,建议根据实际需求选择合适的服务商,并注意API调用频率限制和成本控制。