在 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 在金融科技与健康科技领域应用广泛,可助力发票处理、医疗表单患者数据提取等任务的自动化落地。

相关推荐
lee_curry5 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
QQ1__8115175155 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
小码哥_常6 小时前
解锁AI编程密码:程序员常用的10个AI提示词
后端
九转成圣6 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
直奔標竿7 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵7 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
uzong8 小时前
我研读了 500 个 Spring Boot 生产级代码库,90% 都犯了这 7 个致命错误
后端
野生技术架构师9 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
xiaobaoyu9 小时前
ssm知识点梳理
后端