Recuperar PDF do Banco de Dados e mostrar ele na tela

7 respostas
I

Boa tarde pessoal,

Estou com uma dificuldade em fazer o seguinte:

Tenho uma aplicação WEB, usando JSF e Primefaces e MYSQL.
Tem uma tela de cadastro de produto e nele preciso selecionar um PDF, eu consegui anexar esse PDF e da um “insert” no Banco como “BLOB”, porém na hora de listar, não estou conseguindo.

O que preciso… Dar um select nessa tabela e mostrar o PDF para o cliente, porém não estou conseguindo…

ProdutoDAO

StringBuilder sql = new StringBuilder();
	sql.append("SELECT idProcesso, Processo");
	sql.append(" FROM processos ");
	sql.append(" ORDER BY idProcesso ASC");

	Connection conexao = ConexaoFactory.conectar();

	PreparedStatement comando = conexao.prepareStatement(sql.toString());

	ResultSet resultado = comando.executeQuery();

	ArrayList<Processos> lista = new ArrayList<Processos>();

	while (resultado.next()) {

		Processos item = new Processos();
		item.setArquivo("select no campo PDF,");
		item.setIdProcessos(resultado.getInt("idProcesso"));

		lista.add(item);
	}

	return lista;
}

Processo.xhtml

<p:column headerText="Processo do Cliente">

				<p:outputPanel id="read">
					<p:media value="#{item.arquivo}" player="pdf" /> >
				</p:outputPanel>
			</p:column>

Sou novo, então se precisar mais informações, eu adiciono depois.

7 Respostas

darlan_machado

Novato não faz coisas assim, fera. Novato estuda o básico da linguagem, se chegou aqui, já deixou de ser novato ou está pulando etapas, o que vai trazer muitos outros problemas além deste.

O atributo arquivo, da classe Processos(por que a classe tem nome no plural?) é um byte[]?

V

Você realmente tem um banco de dados que guarda PDF?
Estou trabalhando com algo parecido, mas ao invés de guardar pdf eu guardo o caminho (Path) de onde o arquivo esta armazenado no servidor.

No meu caso eu acho mais fácil pois guardando o caminho eu só preciso executar a seguinte linha

java.awt.Desktop.getDesktop().open(new File(caminho));
darlan_machado

As duas maneiras são possíveis.

Você está usando desktop, fera, isso muda muito as coisas.

I

Não, eu tinha tentando de várias formas… agora ela esta como String, pois eu ia tentar usando o path do PDF.
Porém achei que não seria do melhor jeito.
O que não estou conseguindo é dar o select nessa tabela e converter do BLOB para o arquivo PDF.

darlan_machado

É relativamente simples fazer isso, desde que o arquivo seja, efetivamente, PDF.
O arquivo armazenado no banco de dados, na coluna BLOB é um array de bytes ou byte[], por isso a minha primeira pergunta.
A partir do momento que você lê essa coluna, você pode fazer o seguinte:

OutputStream out = response.getOutputStream();
FileInputStream in = new FileInputStream(arrayQueContemOArquivo);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0){
    out.write(buffer, 0, length);
}
in.close();
out.flush();

Isso vai enviar o arquivo pro browser do usuário. Mas, veja, é extremamente importante ler esse byte[] da coluna BLOB.

I

Legal… vou fazer desta forma, mas a outra duvida é como vou mostrar isso no primefaces, pois tentei de algumas formas e nao deu nenhuma.

Nessa hora:

<p:column headerText="Processo do Cliente">

				<p:outputPanel id="read">
					<p:media value="#{item.arquivo}" player="pdf" /> >
				</p:outputPanel>
			</p:column>
darlan_machado

Fera, para isso você tem que se certificar que o primefaces tem algum componente que suporta renderização de pdf.
Se tiver, o que eu realmente não sei, pois faz muito tempo que não desenvolvo com prime ou jsf, aí você precisa ajustar de acordo com o que o primefaces demanda.
O exemplo que sugeri vai enviar o PDF como arquivo e o browser vai entender que deve ser um download.

Criado 5 de setembro de 2018
Ultima resposta 5 de set. de 2018
Respostas 7
Participantes 3