在 Spring Boot 中使用 Amazon Textract 从图像中提取文本

文章目录

一、概述

企业经常需要从各种类型的图像中提取有意义的数据,例如处理发票或收据以进行费用跟踪,身份文件以进行 KYC(了解你的客户)流程,或自动化表单中的数据录入。然而,手动从图像中提取文本是一个耗时且昂贵的过程。

Amazon Textract 提供了一个自动化的解决方案,利用机器学习从文档中提取印刷文本和手写数据。

在本教程中,我们将探讨如何在 Spring Boot 应用程序中使用 Amazon Textract 来从图像中提取文本。我们将逐步介绍必要的配置,并实现从本地图像文件和存储在 Amazon S3 中的图像中提取文本的功能。

二、项目设置

让我们首先将 Amazon Textract 依赖项添加到项目的 pom.xml 文件中:

2.1 添加项目依赖

让我们首先将 Amazon Textract 依赖项添加到项目的 pom.xml 文件中:

xml 复制代码
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>textract</artifactId>
    <version>2.27.5</version>
</dependency>

此依赖项为我们提供了 TextractClient 和其他相关类,我们将使用这些类与 Textract 服务进行交互。

2.2 定义 AWS 配置属性

现在,为了与 Textract 服务交互并从图像中提取文本,我们需要配置 AWS 凭证以进行身份验证以及我们希望使用服务的 AWS 区域。

我们将这些属性存储在项目的应用程序的 application.yaml 文件中,并使用@ConfigurationProperties 将值映射到一个 POJO,我们的服务层在与 Textract 交互时会引用该 POJO:

java 复制代码
@Validated
@ConfigurationProperties(prefix = "com.baeldung.aws")
class AwsConfigurationProperties {
    @NotBlank
    private String region;

    @NotBlank
    private String accessKey;

    @NotBlank
    private String secretKey;

    // standard setters and getters
}

我们还添加了验证注解,以确保所有必需的属性都正确配置。如果定义的任何验证失败,Spring ApplicationContext 将无法启动。这使我们能够遵循快速失败原则。

以下是我们的 application.yaml 文件的片段,它定义了将自动映射到我们的 AwsConfigurationProperties 类所需的属性:

yaml 复制代码
com:
  baeldung:
    aws:
      region: ${AWS_REGION}
      access-key: ${AWS_ACCESS_KEY}
      secret-key: ${AWS_SECRET_KEY}

我们使用${}属性占位符从环境变量中加载我们的属性值。

因此,这种设置使我们能够将 AWS 属性外部化,并在应用程序中轻松访问它们。

2.3 声明 TextractClient Bean

java 复制代码
@Bean
public TextractClient textractClient() {
    String region = awsConfigurationProperties.getRegion();
    String accessKey = awsConfigurationProperties.getAccessKey();
    String secretKey = awsConfigurationProperties.getSecretKey();
    AwsBasicCredentials awsCredentials = AwsBasicCredentials.create(accessKey, secretKey);

    return TextractClient.builder()
      .region(Region.of(region))
      .credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
      .build();
}

TextractClient 类是与 Textract 服务交互的主要入口点。我们将在服务层中自动装配它,并发送请求以从图像文件中提取文本。

三、从图像中提取文本

现在我们已经定义了 TextractClient bean,接下来创建一个 TextExtractor 类并引用它来实现我们的功能:

java 复制代码
public String extract(@ValidFileType MultipartFile image) {
    byte[] imageBytes = image.getBytes();
    DetectDocumentTextResponse response = textractClient.detectDocumentText(request -> request
      .document(document -> document
        .bytes(SdkBytes.fromByteArray(imageBytes))
        .build())
      .build());
    
    return transformTextDetectionResponse(response);
}

private String transformTextDetectionResponse(DetectDocumentTextResponse response) {
    return response.blocks()
      .stream()
      .filter(block -> block.blockType().equals(BlockType.LINE))
      .map(Block::text)
      .collect(Collectors.joining(" "));
}

在我们的 extract()方法中,我们将 MultipartFile 转换为字节数组,并将其作为 Document 传递给 detectDocumentText()方法。

**Amazon Textract 目前仅支持 PNG、JPEG、TIFF 和 PDF 文件格式。**我们创建了一个自定义的验证注解 @ValidFileType,以确保上传的文件是其中一种支持的格式。

在我们的演示中,通过我们的辅助方法 transformTextDetectionResponse(),我们将 DetectDocumentTextResponse 转换为一个简单的字符串,通过连接每个块的文本内容实现。然而,转换逻辑可以根据业务需求进行自定义。

除了从我们的应用程序中传递图像,我们还可以从存储在 S3 存储桶中的图像中提取文本:

java 复制代码
public String extract(String bucketName, String objectKey) {
    textractClient.detectDocumentText(request -> request
      .document(document -> document
        .s3Object(s3Object -> s3Object
          .bucket(bucketName)
          .name(objectKey)
          .build())
        .build())
      .build());
    
    return transformTextDetectionResponse(response);
}

在我们的重载 extract() 方法中,我们以 S3 存储桶名称和对象键作为参数,从而允许我们指定图像在 S3 中的位置。

需要注意的是,我们调用 TextractClient bean 的 detectDocumentText()方法,这是一个用于处理单页文档的同步操作。然而,对于处理多页文档,Amazon Textract 提供了异步操作。

四、配置 IAM 权限

最后,为了让我们的应用程序正常运行,我们需要为我们在应用程序中配置的 IAM 用户设置一些权限:

yaml 复制代码
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTextractDocumentDetection",
            "Effect": "Allow",
            "Action": "textract:DetectDocumentText",
            "Resource": "*"
        },
        {
            "Sid": "AllowS3ReadAccessToSourceBucket",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}

在我们的 IAM 策略中,AllowTextractDocumentDetection 语句允许我们调用 DetectDocumentText API 来从图像中提取文本。

如果我们是从 S3 存储的图像中提取文本,我们还需要包含 AllowS3ReadAccessToSourceBucket 语句以允许我们的 S3 存储桶的读取访问权限。

我们的 IAM 策略遵循最小特权原则,仅授予应用程序正常运行所需的必要权限。

五、文末总结

本文介绍了如何在 Spring Boot 框架中,借助 Amazon Textract 实现图像文本提取,涵盖了本地图像文件和 Amazon S3 存储图像两种提取场景。

作为一款功能强大的工具,Amazon Textract 在金融科技与健康科技领域应用广泛,可助力发票处理、医疗表单患者数据提取等任务的自动化落地。

相关推荐
ServBay10 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花10 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户67570498850210 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
Flittly10 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
用户67570498850211 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了11 小时前
Java 生成二维码解决方案
java·后端
苍何11 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端
掘金码甲哥11 小时前
1分钟买不了吃亏系列: nginx动态域名解析
后端
神奇小汤圆11 小时前
2026大厂Java岗面试记录:八股+场景+项目+AI,一文讲透快速上岸路径(含答案)
后端
神奇小汤圆11 小时前
我说MySQL每张表最好不超过2000万条数据,面试官让我回去等通知?
后端