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

相关推荐
黎雁·泠崖2 小时前
Java底层探秘入门:从源码到字节码!方法调用的中间形态全解析
java·开发语言
we1less2 小时前
[audio] AudioTrack (六) 共享内存使用分析
java·开发语言
CYTElena2 小时前
关于JAVA异常的笔记
java·开发语言·笔记·语言基础
YIN_尹2 小时前
【C++11】lambda表达式(匿名函数)
java·c++·windows
猴子年华、2 小时前
【每日一技】:SQL 常用函数实战速查表(函数 + 场景版)
java·数据库·sql·mysql
李梨同学丶3 小时前
2025年终总结
后端
码农水水3 小时前
京东Java面试被问:系统限流的实现方式
java·开发语言·面试
苏三的开发日记3 小时前
flume集成kafka
后端
Sheep Shaun3 小时前
STL中的map和set:红黑树的优雅应用
开发语言·数据结构·c++·后端·c#