Transformar Byte em PDF

22 respostas Resolvido
htmljsfjavasql
I

Tenha um aplicação WEB e estou travado em uma situação:

Tenho uma tela que anexo um arquivo PDF…
Depois de ser anexado eu pego esse arquivo e transformo em byte[] e gravo no MYSQL como BLOB.

Porém não estou conseguindo fazer o inverso, ou seja, preciso pegar esse byte[] que esta no banco e listar ele na tela, que seja em um link do tipo “Visualizar”… Como faço essa conversão? Para eu pegar no Front esse PDF?

Obrigado…

22 Respostas

D

Se você não muda o arquivo, não precisa fazer nada além de ler os bytes e escrever no outputstream do response.

J
Solucao aceita

Usa dessa forma.

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=arquivo.pdf");
response.setContentLength(bytesPdf.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytesPdf, 0, bytesPdf.length);
ouputStream.flush();
ouputStream.close();
P

Se vc puder salvar o arquivo em um diretório, por favor faça isso.
Não é pq vc pode enfiar bytes no banco de dados q vc deve fazer isso

I

Então… faltou essa informação… eu nao preciso armazenar esse PDF em nenhum lugar, pois ele só irá aparecer quando o “Cliente” logar e clicar em visualizar, então seria um arquivo TEMP…

A conversão para pdf só aconteceria na hora.

D

Seria um arquivo temp que deveria ficar numa pasta temp e ser lido quando o usuário necessitasse.
Ou, o melhor dos cenários, esse arquivo deve ser gerado apenas quando o usuário clica em visualizar.

J

Se o PDF é gerado em memória não precisa ir pra disco, basta responder esses bytes como já exemplificaram.

J

Qual a justificativa de não poder salvar um arquivo no banco?

P

A resposta se encontra neste post do stackoverflow : Link .

J

Existem vantagens e desvantagens na forma de manter os arquivos salvos.

Por banco, integridade e transação do processo ficam garantidos, ao contrário de guardar os arquivos por conta própria. Então depende dos requisitos/exigências, que nem sempre o mais prioritário é o máximo de desempenho.

Via banco é importante armazenar os blobs em um tablespace próprio. Os SGDBs mais profissionais suportam.

I

O arquivo deve ser gerado apenas quando o usuário clica em visualizar. Logo depois pode ser descartado.

I

Eu salvo ele no banco… mas salvo com byte, porém a conversão dele para PDF que não vou salvar em lugar algum, apenas quando o usuario solicitar.

D

Se essa é a regra, não tem necessidade de armazenar no banco de dados. Você está usando uma estrutura limitada (banco de dados) para armazenar algo volátil.

J

Mas ele nao quis dizer que salva no banco para futuras consultas? Dependendo do SGDB, não é limitado.

D

SGBD utiliza o filesystem… Em algum momento, o espaço para armazenar acaba.
Sem falar da concorrência no insert…
E se o objetivo é, unicamente, apresentar quando o usuário clica no “Visualizar”, basta gerar on demand, quando é necessário. Pronto.

J

Tudo no final é filesystem, independente dos meios. Esse limite vai ser do “disco”, não do banco. Podem ter n tablespaces, cada um em um disco/local. Se for necessário, uma única tabela de blobs em um tablespace. Sobre os gargalos concordo, mas como falei na outra mensagem, depende dos requisitos, aqui o mais prioritário é a integridade/transação, não é sistema tipo facebook.

D

Justamente. Mas, tudo isso acaba em limitações a serem consideradas.
Além disso, o que ele colocou não esclarece se estes arquivos serão gerados e gravados e ficarão lá eternamente ou serão excluídos a cada período de tempo.

J

Também cheguei a imaginar que ele gerava um relatório em PDF, neste caso nao precisaria armazenar em lugar nenhum, mas parece não ser o caso.

I

O seguinte, melhor eu explicar o funcionamento rapidamente…
É um sistema de advocacia, então o advogado(no caso sera o “admin”) pode criar um cliente e um processo…
O processo só existe quando tem um cliente para ele vincular. Então eu preciso deixar armazenado esse arquivo no banco (seria o processo em PDF), pois toda vez que o cliente quiser consultar, vai estar disponível…

D

Ok, entendi o cenário.
Porém, ainda penso que o mais adequado é você manter os dados do processo no banco e, quando necessário, gerar o PDF a partir deles.
Mas, é uma opção fazer conforme você precisa.
De qualquer forma, você só precisa ler o BLOB:

byte[] processo = rs.getBytes("coluna_onde_fica_o_processo");

E, então, seguir o que o @josiloch sugeriu.

I

Não conseguiria fazer daquela forma… não estou usando HttpServletResponse para a chamada.

D

Não, você vai pegar o response dessa maneira

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

Aí você pode fazer exatamente o que ele fez que vai funcionar (logicamente, substituindo os devidos elementos que forem necessários).

I

Ótimo… Consegui fazer deste jeito que vocês me falaram.

Agradeço a disposição de vocês, obrigado a todos.

Criado 11 de setembro de 2018
Ultima resposta 13 de set. de 2018
Respostas 22
Participantes 6