Laravel中无需上传至S3即可调用Textract分析上传PDF是否可行?
Amazon Textract调用是否必须预先上传PDF到S3?
核心结论
不需要强制上传到S3,两种调用模式可选,可根据你的业务场景适配:
- 如果你处理的是单页PDF、文件大小不超过10MB,可以直接用同步API把用户上传的文件二进制流直接传给Textract,完全不用走S3存储
- 如果你处理的是多页PDF、单文件超过10MB,就必须用异步API,这种场景下Textract要求源文件必须存放在S3 bucket中,没有绕过方案
Laravel端直接传PDF流的实现方式
用户上传的PDF可以直接在控制器里拿到二进制内容,不需要落盘也不需要传到S3,直接调用Textract的AnalyzeDocument或者DetectDocumentText同步接口即可,参考实现逻辑:
// 先安装AWS SDK for PHP // composer require aws/aws-sdk-php use Aws\Textract\TextractClient; public function parsePdf(Request $request) { // 验证上传文件格式和大小 $request->validate([ 'pdf_file' => 'required|file|mimes:pdf|max:10240', // 限制10MB以内,适配同步接口要求 ]); // 直接获取上传文件的二进制内容 $pdfContent = file_get_contents($request->file('pdf_file')->getPathname()); // 初始化Textract客户端 $textractClient = new TextractClient([ 'version' => 'latest', 'region' => '替换为你的AWS区域,如us-east-1', 'credentials' => [ 'key' => '你的AWS_ACCESS_KEY_ID', 'secret' => '你的AWS_SECRET_ACCESS_KEY', ] ]); // 调用同步识别接口,直接传Bytes参数,无需配置S3相关参数 $result = $textractClient->detectDocumentText([ 'Document' => [ 'Bytes' => $pdfContent, ] ]); // 处理返回的识别结果 $extractedText = ''; foreach ($result['Blocks'] as $block) { if ($block['BlockType'] === 'LINE') { $extractedText .= $block['Text'] . PHP_EOL; } } return response()->json([ 'extracted_text' => $extractedText ]); }
注意事项
- 同步接口仅支持单页PDF,即使多页PDF大小在10MB以内,Textract也只会返回第一页的识别结果
- 生产环境不要把AWS凭证硬写到代码中,建议用IAM角色、环境变量或者AWS Secrets Manager管理凭证
- 如果业务需要处理多页PDF,只能先将用户上传的文件传到S3,再调用
StartDocumentTextDetection这类异步接口,待识别完成后拉取结果,该场景没有跳过S3的方案
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

