[RESOLVIDO]Imagem do PostgreSQL no iReport

40 respostas Resolvido
Vinicius_Costa1

Bom dia,

Tenho um relatório criado no iReport que preciso mostrar uma imagem que esta em um banco de dados postgreSQL com o tipo bytea[]. Pesquisei em vários tópicos e sites, fiz diversas tentativas porém nenhuma efetiva. Pelo oque entendi, o problema é que o postgre não salva imagens com um tipo chamado BLOB, oque dificulta a inserção de imagem no relatório.

Segue oque eu fiz até agora no iReport baseado nas pesquisas realizadas:

<field name="imagem" class="java.io.InputStream"/>
<imageExpression><![CDATA[new ByteArrayInputStream((byte[])$F{imagem})]]></imageExpression>

E alterei o parâmetro para do elemento imagem para java.awt.Imagem
image

40 Respostas

I

Se não me engano, deve-se evitar salvar imagens no banco. Além disso, se ao contrário o MySQL, o PostgreSQL não suporta BLOB, não seria melhor passar o path da imagem para o IReport?

Cleiton_Conceicao

no jasper só funciona quando o tipo é java.io.InputStream.
faz o teste pra ver se funciona.

rodriguesabner

troca isso:

<imageExpression><![CDATA[new ByteArrayInputStream((byte[])$F{imagem})]]></imageExpression>

por isso:

<imageExpression><![CDATA[$F{imagem}]]></imageExpression>
Vinicius_Costa1

Qual seria a melhor forma? Eu fiz salvando a imagem no BD, tem alguma outra forma melhor de fazer isso?

Vinicius_Costa1

Segui o que você disse, mas aparece isso:

image

Vinicius_Costa1

E no console não aparece nada, nenhum erro, somente aparece esta mensagem.

Vinicius_Costa1

Tentei também, porém aparece a mensagem:

image

E não aparece nada no console

Villagram

Boa tarde, geralmente o que eu faço é colocar a imagem como InputStream. Pra mim funciona numa boa.

Vinicius_Costa1

Mas você utiliza o postgreSQL? Porque pelas pesquisas que fiz, o postgreSQL gera uma dificuldade a mais do que os outros bancos, porque ele não salva a imagem em um formato BLOB (não sei muito bem do que se trata).

rodriguesabner

Cara, não é que gera dificuldade a mais. Só são banco de dados que tratam algumas coisas de forma diferente. Mas é um ótimo banco. Eu uso o postgres e nunca tive problemas pra nada…

Agora uma dúvida, pq vc está utilizando o iReport? Pq não começa a usar o Jasper?

Vinicius_Costa1

Concordo com você, todos meus projetos da faculdade foram sempre feitos no postgreSQL, é um ótimo banco, eu que não estou sabendo lidar com essa situação.

Cara, porque aprendi a usar o iReport, você me recomenda migrar para o Jaspersoft Studio? Ele é melhor?

Villagram

Eu uso Oracle e também passei mal para fazer imagens e outros componentes funcionarem corretamente. Mas independente do gerador de relatórios que você usar você vai ter problemas com outras coisas. Fique bom no que você já sabe e depois procure opções, esse é meu conselho.

Vinicius_Costa1

Entendo, porém é possível você me mostrar o que você faz pra trazer uma imagem do postgreSQL para o iReport? Tentei de várias formas porém algumas dão erro no console, outras dão erro no momento de gerar o relatório…

Villagram

me passa a configuração do campo dentro do postgre para eu conseguir simular aqui que eu te passo certinho.

Vinicius_Costa1

A coluna esta configurada desta forma

Villagram

Eu usei a versão 12 do postgre, criei uma tabela com apenas dois campos (id, image) e inseri um registro com a imagem do meu avatar.

image

Fiz um select diretamente no report, inseri uma imagem e configurei da seguinte forma:

image

Segue resultado:

pra finalizar o xml do campo dentro do report.

Vinicius_Costa1

Fiz a mesma coisa, porém deu erro:

image

Imagem
image
image

Meu field da imagem esta configurado desta forma
image

Será que é a forma como eu salvo a imagem no banco de dados?

Vinicius_Costa1

Select utilizado

image

Esqueci de dizer, mas a mensagem pede pra ver o console para mais detalhes, porém o console fica vazio.

Villagram

bom dia, minha query está igual, a grande questão é se os dados dentro do campo de imagem na sua tabela não tem nada corrompido, algo que não seja uma imagem ou conteúdo nulo.

Vinicius_Costa1

Bom dia, corrompido ou nulo imagino que não deve estar, pois eu consigo recuperar a imagem do banco de dados e exibi-la dentro do netbeans.

Como você envia a imagem para o banco? Eu utilizo o seguinte método para fazer a conversão da imagem para byte(foi um cara daqui que me passou ele)

private byte[] converterImagem(File file) throws FileNotFoundException, IOException {
    FileInputStream fis = new FileInputStream(file);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[1024];
    try {
        for (int readNum; (readNum = fis.read(buf)) != -1;) {
            bos.write(buf, 0, readNum);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    byte[] bytes = bos.toByteArray();

    return bytes;
}
Villagram

bom dia, fiz o teste da seguinte forma:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.file.Files;

@Service
public class ReportByteImage {

    @Autowired
    private ImageRepository imageRepository;

    public void execute() {
        try {
            byte[] image = Files.readAllBytes(new File("C:\\Users\\villagran\\Downloads\\villagran.jpg").toPath());
            imageRepository.save(new ImageTest(1L, image));
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageRepository.findById(1L).get().getImage());
            BufferedImage bufferedImage = ImageIO.read(byteArrayInputStream);
            ImageIcon imageIcon = new ImageIcon(bufferedImage);
            System.out.println("teste");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}
Vinicius_Costa1

Me passa a classe ImageRepository pra eu ver como fica por favor.

Villagram

@Vinicius_Costa1
Boa noite, acho que você vai ficar decepcionado, pois para fazer o exemplo rápido e sem muita configuração eu usei spring.

@Repository
public interface ImageRepository extends JpaRepository<Long, ImageTest> {

}
Vinicius_Costa1

@Villagram
Esses conceitos são avançados pro meu conhecimento, não consegui aplicar seu método no meu código.

Villagram

@Vinicius_Costa1
Segue exemplo para substituir seu método:

import java.io.File;
import java.nio.file.Files;

public class ReportByteImage {
    
    private byte[] converterImagem(File file) {
        try {
            return Files.readAllBytes(file.toPath());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
    
}
Vinicius_Costa1

@Villagram
Utilizei este método que você me passou e salvei outra imagem no banco, porém apareceu a mesma situação no iReport

image

Mesmo assim ainda imagino que seja o método que eu salvo a imagem no banco que pode estar ocasionando este problema

Villagram

Qual o erro que o console do ireport passa?

Vinicius_Costa1

Esse é o problema, o console fica em branco

Villagram

na outra de compilar o relatório da algum erro? você já tentou tirar a imagem e rodar só com os dados?

As vezes você pode estar pensando que é uma coisa e na verdade seja um conjunto de coisas.

Vinicius_Costa1

Se eu tirar a imagem, o relatório compila normalmente, fica tudo perfeito, ele só da erro quando eu insiro a imagem.

Vinicius_Costa1

Até criei outro relatório em branco e peguei somente a field de imagem do banco pra fazer o teste, e também da erro.

Villagram

essas imagens são muito grandes? ou tem algum formato diferente?

Vinicius_Costa1

Fiz o teste com 2 imagens, ambas são .jpg e possuem em torno de 1MB.

Vinicius_Costa1

Pesquisei até em fóruns de outras linguas, até tentei fazer de várias outras formas que aparentemente deram certo pra outras pessoas, porém quando eu executo o preview do relatório, aparece aquela mensagem de erro e sem nada no console. Por isso eu imagino que seja a forma como eu estou salvando a imagem no banco.

Villagram

eu já tive muitos problemas com imagens .jpg pela razão de existir a porra do .jpeg e mesmo se disserem que é mesma coisa, não acredite, essa merda de “e” as vezes faz toda diferença, eu prefiro usar .png ou .gif.

mas olhando seu problema dessa maneira superficial fica difícil saber o que realmente esta acontecendo, pois o erro é para expor o relatório, então imagino eu que está tudo certo, o problema aparentemente é de renderização do preview ou mesmo de uso de memória.

talvez se você rodar o relatório direto da aplicação funcione sem nenhum problema.

Vinicius_Costa1

Tentei com uma imagem .png e não deu certo também. Complicado cara, não acho solução.
Vou tentar fazer no JasperSoft, se não der certo, vou tentar jogar direto na aplicação java o relatório e ver se funciona. Se não der, vou migrar para o MySQL, pois pelas pesquisas que fiz, pelo jeito lá é mais simples essa ponte entre a imagem e o iReport.

Posteriormente posto os resultados

De qualquer forma, obrigado pela ajuda.

Villagram
Solucao aceita

Não acho que o Jasper vai resolver se for problema de relatório visto que o IReport é desenvolvido por eles, também não acho que seja um problema com o banco de dados, como eu disse acho que pode ser um problema de renderização dentro da IDE, rodar direto no sistema é a melhor opção para riscar a possibilidade da lista.

Eu usei o IReport 5.6 com NetBeans 8.2 para rodar o preview.

Vinicius_Costa1

Rapaz, era isso mesmo, coloquei o relatório na aplicação java e deu certo, o relatório trouxe a imagem normalmente.

Cara muito obrigado pela ajuda, desde o começo então era problema na renderização que o iReport estava fazendo. Fica a sua dica para as pessoas que vierem a enfrentar o mesmo problema.

rodriguesabner

Só um detalhe, o Jasper pode resolver sim, até pq o iReport tá descontinuado, eu consigo recuperar imagens com aquele trecho de código que passei lá no começo. Vale a pena tentar

Vinicius_Costa1

O seu código deu certo orochimaru, o problema era realmente algo envolvendo o iReport na hora de renderizar. Foi somente executar o relatório pela aplicação do netbeans e funcionou perfeitamente. Como é algo que funciona apenas mudando de IDE, creio que realmente funcionária no Jasper.

Criado 12 de maio de 2020
Ultima resposta 20 de mai. de 2020
Respostas 40
Participantes 5