Search code examples
javaamazon-web-servicesspring-bootamazon-s3amazon-textract

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


I am trying to call AWS Textract service in java. I have managed to work it using the local path in my desktop. However, I am having error integrating an Amazon S3 Bucket path into the application. Could you please advise?

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());
        });
        
    }
}

After uncommenting the S3 codes and commenting the local image path. the console returns this error

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)

Solution

  • Thanks @smac2020 for the proper OOD java codes. Will reference that in the future.

    I also finally managed to get it working with the below code with the below article:

    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);
    

    Working Code

    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());
            });
            
        }
    }