Installation
composer require helgesverre/receipt-scanner
php artisan vendor:publish --tag="receipt-scanner-config"
php artisan vendor:publish --provider="OpenAI\Laravel\OpenAIServiceProvider"
Add OPENAI_API_KEY to .env.
First Use Case Scan a receipt image from a file:
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner;
$result = ReceiptScanner::scan(file_get_contents('path/to/receipt.png'));
dd($result); // Structured receipt data (e.g., total, items, vendor)
Key Config
Check config/receipt-scanner.php for:
model (default: gpt-3.5-turbo).temperature (default: 0.2 for consistency).max_tokens (default: 1000).OCR + AI Pipeline
// For PDFs/images (auto-detects OCR via Textract if configured)
$data = ReceiptScanner::scanFromFile('receipt.pdf');
Email Attachment Handling
$email = Mail::getMessage(); // From Laravel Notifications
$attachments = $email->getAttachments();
foreach ($attachments as $attachment) {
$receipt = ReceiptScanner::scan($attachment->getContent());
// Store in DB
}
Batch Processing
$files = Storage::disk('s3')->files('receipts/');
foreach ($files as $file) {
$content = Storage::disk('s3')->get($file);
$result = ReceiptScanner::scan($content);
// Process $result
}
Storage::disk() to fetch files before scanning.ScanReceiptJob::dispatch($filePath)->onQueue('receipts');
scan().try {
$result = ReceiptScanner::scan($content);
} catch (\OpenAI\Exceptions\RateLimitException $e) {
// Implement exponential backoff
}
OCR Limitations
.env:
RECEIPT_SCANNER_OCR=textract
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
Prompt Sensitivity
locale in config).setPrompt()):
ReceiptScanner::setPrompt(file_get_contents('custom-prompt.txt'));
Cost Management
max_tokens wisely.$cacheKey = md5($content);
$result = cache()->remember($cacheKey, now()->addHours(1), function() use ($content) {
return ReceiptScanner::scan($content);
});
File Size Limits
// Pre-process PDFs to extract first N pages
$pdf = \Spatie\PdfToText\Pdf::getText('large-receipt.pdf');
$firstPage = explode("\n\n", $pdf)[0]; // Simplistic example
$result = ReceiptScanner::scan($firstPage);
'debug' => env('RECEIPT_SCANNER_DEBUG', false),
validate() to ensure expected fields:
$validated = $result->validate([
'total' => 'required|numeric',
'items' => 'array',
'items.*.description' => 'string',
]);
Custom Models Override the default OpenAI model in config or dynamically:
ReceiptScanner::setModel('gpt-4'); // For complex receipts
Post-Processing
Extend the scan() result with additional logic:
$result = ReceiptScanner::scan($content);
$result->tax_rate = $result->total / (1 + $result->tax_percentage);
Event Listeners Dispatch events after scanning:
event(new ReceiptScanned($result));
Listen for validation/processing:
ReceiptScanned::listen(function ($event) {
$event->receipt->save();
});
How can I help you explore Laravel packages today?