(SpringBoot 使用 Amazon S3 存储桶调用 Textract):错误 The method builder() is undefined for the type Document

(SpringBoot to call Textract with an Amazon S3 bucket) : error The method builder() is undefined for the type Document

我正在尝试调用 java 中的 AWS Textract 服务。我已经设法使用桌面上的本地路径来处理它。但是,我在将 Amazon S3 存储桶路径集成到应用程序时出错。能请教一下吗?

package aws.cloud.work;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.io.InputStream;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.amazonaws.services.textract.AmazonTextract;
import com.amazonaws.services.textract.AmazonTextractClientBuilder;
import com.amazonaws.services.textract.model.DetectDocumentTextRequest;
import com.amazonaws.services.textract.model.DetectDocumentTextResult;
import com.amazonaws.services.textract.model.Document;
import com.amazonaws.services.textract.model.S3Object;
import com.amazonaws.util.IOUtils;

import software.amazon.awssdk.core.SdkBytes;

public class TextractDemo3 {

    static AmazonTextractClientBuilder clientBuilder = AmazonTextractClientBuilder.standard().withRegion(Regions.AP_SOUTH_1);

    public static void main(String[] args) throws IOException {

//Set AWS credentials       
        clientBuilder.setCredentials(new AWSStaticCredentialsProvider(new
                BasicAWSCredentials("Access key", "Secretkey")));

//**Integrating S3 Error        
//      AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();  
//      com.amazonaws.services.s3.model.S3Object s3Object = s3Client.getObject(new GetObjectRequest("textract-bucket", "image.jpg"));
//      S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
//      SdkBytes bytes = SdkBytes.fromInputStream(s3ObjectInputStream);
//      Document document = Document.builder().bytes(bytes).build();

//Path to obtain image in local computer        
        String document="localpathimage";
        ByteBuffer imageBytes;

//Textract Client Service
        try (InputStream inputStream = new FileInputStream(new File(document))) {
            imageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream));
        }
        AmazonTextract client = clientBuilder.build();
        DetectDocumentTextRequest request = new DetectDocumentTextRequest()
                .withDocument(new Document()
                        .withBytes(imageBytes));

        DetectDocumentTextResult result = client.detectDocumentText(request);
        System.out.println(result);
        
        result.getBlocks().forEach(block ->{
            if(block.getBlockType().equals("LINE"))
            System.out.println("text is "+ block.getText() + " confidence is "+ block.getConfidence());
        });
        
    }
}

取消注释 S3 代码并注释本地图像路径后。控制台 returns 这个错误

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method builder() is undefined for the type Document

    at aws.cloud.work.TextractDemo3.main(TextractDemo3.java:40)

您的代码有问题。首先,您混合了 Java V1 和 V2 - 这是一种非常糟糕的做法。看看这个 Java 导入语句:

导入software.amazon.awssdk.core.SdkBytes;

这是 V2 API。也就是说,以software.amazon...开头的包是V2。 V1 包以 com.amazonaws.services...

开头

要使此用例正常工作,请完全迁移到适用于 Java V2 的 AWS SDK。您可以在此处找到 Textract V2 示例:

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/example_code/textract

要了解如何创建使用 AWS SDK for Java V2 的 Spring BOOT 应用程序,请参阅这个使用一些 AWS 服务的端到端示例:

Creating your first AWS Java web application

如本例所示,最佳做法是确保您的所有 AWS 调用都使用 Java SDK 的版本 2。

因为您在您的应用程序中使用 Amazon S3,请参阅此示例,该示例展示了如何在 Spring BOOT 应用程序中使用 Amazon S3 Java V2 调用(和其他 AWS 服务)。它演示了如何读取 Amazon S3 对象并将字节数组传递给其他服务(在此示例中,数据传递给 Amazon Rekognition)。对于您的用例,您需要将数据传递给 Textract 服务。

Creating an example AWS photo analyzer application using the AWS SDK for Java

更新

我使用适用于 Java V2 的 AWS 开发工具包获得了一个 Spring BOOT 应用程序,完美适用于 Amazon Textract 和 Amazon S3。

参见:https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/creating_document_analyzer

感谢@smac2020 提供正确的 OOD java 代码。以后会参考。

我也终于设法让它在下面的文章中使用下面的代码:

https://github.com/awsdocs/amazon-textract-developer-guide/blob/master/doc_source/sync-calling.mdhttps://github.com/awsdocs/amazon-textract-developer-guide/blob/master/doc_source/sync-calling.md

String document="input.png";
String bucket="bucket";

AmazonTextract client = AmazonTextractClientBuilder.defaultClient();

DetectDocumentTextRequest request = new DetectDocumentTextRequest()
        .withDocument(new Document()
                .withS3Object(new S3Object()
                        .withName(document)
                        .withBucket(bucket)));

DetectDocumentTextResult result = client.detectDocumentText(request);

工作代码

package aws.cloud.work;

import java.io.IOException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.textract.AmazonTextract;
import com.amazonaws.services.textract.AmazonTextractClientBuilder;
import com.amazonaws.services.textract.model.DetectDocumentTextRequest;
import com.amazonaws.services.textract.model.DetectDocumentTextResult;
import com.amazonaws.services.textract.model.Document;
import com.amazonaws.services.textract.model.S3Object;

public class TextractOriginalMaster3 {

    static AmazonTextractClientBuilder clientBuilder = AmazonTextractClientBuilder.standard().withRegion(Regions.AP_SOUTHEAST_1);

    public static void main(String[] args) throws IOException {
       
        //Set AWS Credentials to use Textract
        clientBuilder.setCredentials(new AWSStaticCredentialsProvider(new
                BasicAWSCredentials("Accesskey", "Secretkey")));

        //**Getting document from S3 Bucket Path
        String document = "image.png";
        String bucket = "Bucket Name";

        //Calling AWS Textract Client
        AmazonTextract client = clientBuilder.build();
        DetectDocumentTextRequest request = new DetectDocumentTextRequest()
                .withDocument(new Document()
                        .withS3Object(new S3Object()
                                .withName(document)
                                .withBucket(bucket)));
        DetectDocumentTextResult result = client.detectDocumentText(request);
        System.out.println(result);
        result.getBlocks().forEach(block -> {
            if (block.getBlockType().equals("LINE"))
                System.out.println("text is " + block.getText() + " confidence is " + block.getConfidence());
        });
        
    }
}