Conversão S3OBjectInputStream para Objeto FILE

Boa Tarde!!!

Estou começando a trabalhar com o serviço da Amazon, em que tenho um site que permite fazer upload de documentos. Queria saber se é possível converter um objeto do tipo S3ObjectInputStream para Objeto File, uma vez que preciso fazer a extração de texto de documentos digitalizados usando OCR asprise (por meio da função recognize() ) e a citada função só aceita objeto tipo File. Então como converter um objeto S3ObjectInputStream para Objeto Tipo File?

Pelo que vi no javadoc, essa classe S3ObjectInputStream herda de InputStream. Com isso, vc deve conseguir jogar os dados do arquivo num outputstream assim:

InputStream inputStream = (InputStream) s3Object;
File file = new File("path/to/file/meuArquivo");

try (FileOutputStream outputStream = new FileOutputStream(file)) {
	int read;
	byte[] bytes = new byte[1024];
	
	while ((read = inputStream.read(bytes)) != -1) {
		outputStream.write(bytes, 0, read);
	}
}
1 curtida

Então, o que acontece, eu precisaria de carregar o arquivo direto da minha aplicação, em que acesso o arquivo via getObjetct(bucket_name,key_name), que acaba retornando em um objeto S3OBjectInputStream. Pela sua resposta, primeiro cria-se uma instância carregando o arquivo de ujma pasta local e depois disso realiza-se a conversão?.Meu objeto é de passar esse objeto ou grava-lo em um aquivo do tipo File.

Esse getObject retorna uma instância de S3OBjectInputStream ? Então, ao fazer:

S3OBjectInputStream s3Object = getObjetct(bucket_name,key_name);
InputStream inputStream = (InputStream) s3Object;

vc terá um inputstream com os dados nele. Com isso, vc conseguirá converter esse stream de dados para um objeto do tipo File (conforme exemplo que passei).

1 curtida

Ai no caso, não preciso de declarar uma instância de File?

Conforme exemplo que passei, sim (tinha esquecido de colocar e editei minha resposta =P).

1 curtida

Então, tentei isso e não tá dando muito certo…Tentei usar a função copyInputStreamToFile() para copiar o arquivo convertido para um arquivo temporário de forma a servir como entrada para a função recognize(), mas o que retorna no log da aplicação é o seguinte:

[, <error: failed to read file: C:\Users\Nando\AppData\Local\Temp\temp8470746623956443139.tmp>
InputStream in = (InputStream) fileS3;
File targetFile = File.createTempFile("temp", null);
FileUtils.copyInputStreamToFile(in, targetFile);

Ocr.setUp();
Ocr ocr = new Ocr();
ocr.startEngine("por",Ocr.SPEED_FASTEST);
String s = ocr.recognize(new File[] { new File(targetFile.getAbsolutePath()) }, Ocr.RECOGNIZE_TYPE_ALL,Ocr.OUTPUT_FORMAT_PLAINTEXT);

return s;

O arquivo temp8470746623956443139.tmp foi gravado com corretamente?

Sobre o erro, vc tem a stacttrace completa? Se sim, posta aqui (é importante).

Não tenho idéia se o arquivo temp realmente foi gravado, nessa parte eu ainda sou bem leigo, tó meio que indo na tentativa e erro…kkk…

segue a stacttrace:

jul 07, 2020 9:27:02 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.1.16.Final}
jul 07, 2020 9:27:02 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
jul 07, 2020 9:27:02 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
jul 07, 2020 9:27:02 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
jul 07, 2020 9:27:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
jul 07, 2020 9:27:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/docnuvem_contabilidade]
jul 07, 2020 9:27:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=postgres, password=****}
jul 07, 2020 9:27:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
jul 07, 2020 9:27:02 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
jul 07, 2020 9:27:03 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
jul 07, 2020 9:27:03 AM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
jul 07, 2020 9:27:03 AM org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@313b2ea6
Inicializando processamento de 1 documento(s).
Inicializando o processamento de texto do documento pdf digitalizado
Texto extraído: [, <error: failed to read file: C:\Users\Nando\AppData\Local\Temp\temp8470746623956443139.tmp>]
Texto extraido com sucesso do documento: FGTS.pdf
jul 07, 2020 9:27:15 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Finalizando processamento de 1 documento(s). Tempo: 8s

Para saber se o arquivo foi criado, vá nesse caminho: C:\Users\Nando\AppData\Local\Temp\temp8470746623956443139.tmp e veja se o arquivo está lah. Veja se o tamanho e/ou o conteúdo estão corretos.

foi criado sim com o nome temp8470746623956443139.tmp e o KB de memória

Faça um teste, mude seu código para ficar assim:

InputStream in = (InputStream) fileS3;
File targetFile = new File("C:/teste-fgts.pdf");
FileUtils.copyInputStreamToFile(in, targetFile);

Ocr.setUp();
Ocr ocr = new Ocr();
ocr.startEngine("por",Ocr.SPEED_FASTEST);
String s = ocr.recognize(new File[] { new File(targetFile.getAbsolutePath()) }, Ocr.RECOGNIZE_TYPE_ALL,Ocr.OUTPUT_FORMAT_PLAINTEXT);

return s;

No log de erro, reparei que vc está tentando extrair alguma coisa de um arquivo chamado FGTS.pdf. Com isso, mudei para ele gravar os dados do arquivo vindo do fileS3 em um outro arquivo chamado teste-fgts.pdf.

então, eu iniciei fazendo dessa forma pra aprender a extrair o texto de um documento scaneado, lendo um arquivo da minha pasta local… acontece que tó trabalhando em uma aplicação web que tá rodando no servidor da Amazon, que puxa do banco de dados o documento ao fazer upload…e quando faço o upload, é retornado em um objeto S3OjectInputStream…

Então esse fileS3 é resultado de um upload?

isso mesmo, ele que carrega o arquivo do servidor após a realização do upload

Depois que o arquivo foi copiado para esse caminho: C:\Users\Nando\AppData\Local\Temp\temp8470746623956443139.tmp, vc consegue abrir ele e visualizar seu conteúdo?

consigo abrir com o sublime text, mas n possui nenhum conteúdo

Então o arquivo não foi gravado corretamente. Qual valor é retornado se vc fizer: fileS3.available(); ?

Ola, eu to com um questão como eu faço para mostrar x ao quadrado na tela do jframe?

é retornado o seguinte:

jul 07, 2020 10:09:25 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.1.16.Final}
jul 07, 2020 10:09:25 AM org.hibernate.cfg.Environment
INFO: HHH000206: hibernate.properties not found
jul 07, 2020 10:09:25 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
jul 07, 2020 10:09:25 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
jul 07, 2020 10:09:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
jul 07, 2020 10:09:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/docnuvem_contabilidade]
jul 07, 2020 10:09:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=postgres, password=****}
jul 07, 2020 10:09:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
jul 07, 2020 10:09:26 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
jul 07, 2020 10:09:26 AM org.hibernate.dialect.Dialect
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
jul 07, 2020 10:09:26 AM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
jul 07, 2020 10:09:26 AM org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@313b2ea6
Inicializando processamento de 1 documento(s).
Inicializando o processamento de texto do documento pdf digitalizado
Erro na extração do texto do arquivo pdf: FGTS.pdf
java.io.IOException: Attempted read on closed stream.
at org.apache.http.conn.EofSensorInputStream.isReadAllowed(EofSensorInputStream.java:107)
at org.apache.http.conn.EofSensorInputStream.available(EofSensorInputStream.java:155)
at com.amazonaws.internal.SdkFilterInputStream.available(SdkFilterInputStream.java:102)
at com.amazonaws.internal.SdkFilterInputStream.available(SdkFilterInputStream.java:102)
at com.amazonaws.services.s3.model.S3ObjectInputStream.available(S3ObjectInputStream.java:121)
at com.amazonaws.internal.SdkFilterInputStream.available(SdkFilterInputStream.java:102)
at com.amazonaws.internal.SdkFilterInputStream.available(SdkFilterInputStream.java:102)
at java.io.FilterInputStream.available(FilterInputStream.java:168)
at com.amazonaws.internal.SdkFilterInputStream.available(SdkFilterInputStream.java:102)
at com.amazonaws.services.s3.internal.S3AbortableInputStream.available(S3AbortableInputStream.java:89)
at com.amazonaws.internal.SdkFilterInputStream.available(SdkFilterInputStream.java:102)
at com.amazonaws.services.s3.model.S3ObjectInputStream.available(S3ObjectInputStream.java:121)
at br.com.service.DocumentoProcessoService.processaDocumentos(DocumentoProcessoService.java:164)
at br.com.main.ProcessaDocumento2.main(ProcessaDocumento2.java:58)
jul 07, 2020 10:09:37 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Finalizando processamento de 1 documento(s). Tempo: 8s