helgesverre / receipt-scanner
使用OpenAI从文本、Html、图像和PDFs中提取结构化收据和发票数据。
Requires
- php: ^8.1|^8.2
- ext-zip: *
- aws/aws-sdk-php: ^3.281
- illuminate/contracts: ^10.0|^11.0
- jstewmc/rtf: ^0.5.2
- league/flysystem-aws-s3-v3: ^3.16
- openai-php/laravel: ^v0.8.1
- prinsfrank/standards: ^2.1
- smalot/pdfparser: *
- spatie/laravel-package-tools: ^1.14.0
- symfony/dom-crawler: ^6.3
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.8|^8.1
- orchestra/testbench: ^8.8
- pestphp/pest: ^2.0
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
README
需要更多灵活性? 尝试使用Extractor包,这是一个用于Laravel的AI数据提取库
用于Laravel的AI收据和发票扫描器
使用OpenAI,轻松从您的Laravel应用程序中的图像、PDFs和电子邮件中提取结构化收据数据。
功能
- OpenAI Chat和Completion端点的轻量级包装。
- 接受文本作为输入,并返回结构化收据信息。
- 包括用于解析收据的优化提示。
- 支持包括纯文本、PDF、图像、Word文档和Web内容在内的各种输入格式。
- 与Textract集成以提供OCR功能。
安装
通过composer安装包
composer require helgesverre/receipt-scanner
发布配置文件
php artisan vendor:publish --tag="receipt-scanner-config"
所有配置选项都在配置文件中进行了文档说明。
由于此包使用OpenAI Laravel Package,因此您还需要发布他们的配置,并将OPENAI_API_KEY
添加到您的.env
文件中
php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider"
OPENAI_API_KEY="your-key-here
用法
从纯文本中提取收据数据
当您已经拥有收据或发票的文本表示时,纯文本扫描非常有用。
以下示例来自Paddle.com收据电子邮件,我将电子邮件中的所有文本都复制下来,并删除了所有空行。
$text = <<<RECEIPT Liseth Solutions AS via software reseller Paddle.com Thank you for your purchase! Your full invoice is attached to this email. Amount paid Payment method NOK 2,498.75 visa ending in 4242 Test: SaaS Subscription - Pro Plan September 22, 2023 11:04 am UTC - October 22, 2023 11:04 am UTC NOK 1,999.00 QTY: 1 Subtotal NOK 1,999.00 VAT NOK 499.75 Amount paid* NOK 2,498.75 *This payment will appear on your statement as: PADDLE.NET* EXAMPLEINC NEED HELP? Need help with your purchase? Please contact us on paddle.net. logo Paddle.com Market Ltd, Judd House, 18-29 Mora Street, London EC1V 8BT © 2023 Paddle. All rights reserved. RECEIPT; ReceiptScanner::scan($text);
从其他格式提取数据
use HelgeSverre\ReceiptScanner\Facades\Text; $textPlainText = Text::text(file_get_contents('./receipt.txt')); $textPdf = Text::pdf(file_get_contents('./receipt.pdf')); $textImageOcr = Text::textract(file_get_contents('./receipt.jpg')); $textPdfOcr = Text::textractUsingS3Upload(file_get_contents('./receipt.pdf')); $textWord = Text::word(file_get_contents('./receipt.doc')); $textWeb = Text::web('https://example.com'); $textHtml = Text::html(file_get_contents('./receipt.html'));
加载后,您可以将TextContent
或纯文本(可以通过调用->toString()
检索)传递给ReceiptScanner::scan()
方法。
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner; ReceiptScanner::scan($textPlainText) ReceiptScanner::scan($textPdf) ReceiptScanner::scan($textImageOcr) ReceiptScanner::scan($textPdfOcr) ReceiptScanner::scan($textWord) ReceiptScanner::scan($textWeb) ReceiptScanner::scan($textHtml)
收据数据模型
扫描的收据被解析成一个DTO,它由一个包含收据元数据的Receipt
主类和一个表示收据或发票上的卖家的Merchant
dto组成,以及一个包含每个单独项目行的LineItem
dto数组。
HelgeSverre\ReceiptScanner\Data\Receipt
HelgeSverre\ReceiptScanner\Data\Merchant
HelgeSverre\ReceiptScanner\Data\LineItem
该DTO有一个toArray()
方法,将生成如下结构
为了灵活性,所有字段都是可空的。
[ "orderRef" => "string", "date" => "date", "taxAmount" => "number", "totalAmount" => "number", "currency" => "string", "merchant" => [ "name" => "string", "vatId" => "string", "address" => "string", ], "lineItems" => [ [ "text" => "string", "sku" => "string", "qty" => "number", "price" => "number", ], ], ];
返回数组而不是DTO
如果您更喜欢使用数组而不是内置的DTO,可以在调用scan()
时指定asArray: true
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner; ReceiptScanner::scan( $textPlainText asArray: true )
指定模型
要使用不同的模型,可以在调用scan()
方法时使用model
命名参数指定要使用的模型名称。
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner; use HelgeSverre\ReceiptScanner\ModelNames; // With the ModelNames class ReceiptScanner::scan($content, model: ModelNames::GPT4_1106_PREVIEW) // With a string ReceiptScanner::scan($content, model: 'gpt-4-1106-preview')
所有参数及其功能
$text
(TextContent|string)
需要解析的收据或发票的输入文本。它接受一个TextContent
对象或字符串。
**$model
(string)
此参数指定用于提取过程的OpenAI模型。
HelgeSverre\ReceiptScanner\ModelNames
是一个包含每个模型的常量类,提供方便。然而,如果您愿意,也可以直接使用字符串来指定模型。
不同的模型有不同的速度/准确性特性。
如果您需要高精度,请使用GPT-4模型;如果您需要速度,请使用GPT-3模型;如果您需要更高的速度,请使用gpt-3.5-turbo-instruct
模型。
默认模型是ModelNames::TURBO_INSTRUCT
。
$maxTokens
(int)
模型将处理的令牌的最大数量。默认值为 2000
,对于非常长的文本,可能需要调整此值,但通常2000已经相当好了。
$temperature
(浮点数)
控制模型输出的随机性/创造力。
更高的值(例如,0.8)会使输出更随机,在这个场景中通常不是我们想要的,我通常使用0.1或0.2,超过0.5变得没有用。默认值为 0.1
。
$template
(字符串)
此参数指定用于提示的模板。
默认模板是 'receipt'
。您可以通过在 resources/views/vendor/receipt-scanner/
目录中添加新的blade文件来创建并使用额外的模板,并将文件名(不带扩展名)指定为 $template
值(例如: "minimal_invoice"
)。
$asArray
(布尔值)
如果为真,则将AI模型的响应作为数组而不是DTO返回,如果您需要修改默认DTO以包含更多/更少的字段或将响应转换为自己的DTO,则很有用,默认为 false
。
示例用法
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner; $parsedReceipt = ReceiptScanner::scan( text: $textInput, model: ModelNames::TURBO_INSTRUCT, maxTokens: 500, temperature: 0.2, template: 'minimal_invoice', asArray: true, );
支持的模式列表
AWS Textract的OCR配置
要使用AWS Textract从大图像和多页PDF中提取文本,该包需要将文件上传到S3,并将S3对象位置传递给textract服务。
因此,您需要在 config/receipt-scanner.php
文件中配置您的AWS凭据如下所示
TEXTRACT_KEY="your-aws-access-key" TEXTRACT_SECRET="your-aws-security" TEXTRACT_REGION="your-textract-region" # Can be omitted TEXTRACT_VERSION="2018-06-27"
您还需要配置一个单独的textract磁盘,用于存储文件,打开您的 config/filesystems.php
配置文件并添加以下内容
'textract' => [ 'driver' => 's3', 'key' => env('TEXTRACT_KEY'), 'secret' => env('TEXTRACT_SECRET'), 'region' => env('TEXTRACT_REGION'), 'bucket' => env('TEXTRACT_BUCKET'), ],
请确保 config/receipt-scanner.php
中的 textract_disk
设置与 filesystems.php
配置中的磁盘名称相同,您可以使用 .env 值 TEXTRACT_DISK
进行更改。
return [ "textract_disk" => env("TEXTRACT_DISK") ];
.env
TEXTRACT_DISK="uploads"
注意
并非所有地区都提供Textract
问:在哪些AWS地区中Amazon Textract可用?Amazon Textract目前在以下地区可用:美国东部(弗吉尼亚北部)、美国东部(俄亥俄)、美国西部(俄勒冈)、美国西部(北加利福尼亚)、AWS GovCloud(美国西部)、AWS GovCloud(美国东部)、加拿大(中部)、欧洲(爱尔兰)、欧洲(伦敦)、欧洲(法兰克福)、欧洲(巴黎)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(首尔)和亚太地区(孟买)。
参见:https://aws.amazon.com/textract/faqs/
发布提示
您可以通过运行以下命令来发布底层使用的提示文件
php artisan vendor:publish --tag="receipt-scanner-prompts"
此包简单地使用blade文件作为提示,{{ $context }}
变量将被您传递给 ReceiptScanner::scan("text here")
的文本替换。
添加提示/模板
默认情况下,该包使用 receipt.blade.php
文件作为其提示模板,您可以通过在 resources/views/vendor/receipt-scanner/minimal_invoice.blade.php
中创建一个新的blade文件并更改调用 scan()
时的 $template
参数来添加额外的模板。
示例提示
Extract the following fields from the text below, output as JSON date (as string in the Y-m-d format) total_amount (as float, do not include currency symbol) vendor_name (company name) {{ $context }} OUTPUT IN JSON
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner; $receipt = ReceiptScanner::scan( text: "Your invoice here", model: ModelNames::TURBO_INSTRUCT, template: 'minimal_invoice', asArray: true, );
许可证
此包受MIT许可证许可。有关详细信息,请参阅 许可证文件。