Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Exibir imagem no ireport que vem do banco

Boa tarde, não estou conseguindo exibir uma imagem no ireport. A imagem esta no banco de dados postgres em um campo tipo bytea

8 respostas

Oi Giovanni,

vou te passar um link do fórum do Jaspersoft Community que trata exatamente esse assunto:

https://community.jaspersoft.com/wiki/using-images-stored-database-reports

abs, Nico

Bom dia Nico, fiz o mesmo processo que estava no link, mas aparece esse erro:

Error filling print... Unable to get value for field 'img_multa' of class 'java.awt.Image' net.sf.jasperreports.engine.JRException: Unable to get value for field 'img_multa' of class 'java.awt.Image' at net.sf.jasperreports.engine.JRResultSetDataSource.getFieldValue(JRResultSetDataSource.java:328) at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1358) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1259) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1614) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:150) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87) at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:287) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:760) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:891) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: net.sf.jasperreports.engine.JRException: Image read failed. at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73) at net.sf.jasperreports.engine.util.JRImageLoader.loadAwtImageFromBytes(JRImageLoader.java:167) at net.sf.jasperreports.engine.JRResultSetDataSource.getFieldValue(JRResultSetDataSource.java:318) ... 13 morePrint not filled. Try to use an EmptyDataSource...

Oi Giovanni,

vc sabe dizer se a imagem está salvo no banco como base64 encoded?

abs

Ele esta em um campo do tipo bytea no postgres. No java, para salvar a imagem estou usando as seguintes classes:

   public byte[] getImgBytes(BufferedImage image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "JPEG", baos);
        } catch (IOException ex) {
            //handle it here.... not implemented yet...
        }

        InputStream is = new ByteArrayInputStream(baos.toByteArray());

        return baos.toByteArray();
    }

Botão para escolher a imagem:

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JFileChooser fc = new JFileChooser();
        int res = fc.showOpenDialog(null);

        if (res == JFileChooser.APPROVE_OPTION) {
            File arquivo = fc.getSelectedFile();

            try {
                BufferedImage img = control.setImagemDimensao(arquivo.getAbsolutePath());
            } catch (Exception ex) {
               // System.out.println(ex.printStackTrace().toString());
            }

        } else {
            JOptionPane.showMessageDialog(null, "Voce nao selecionou nenhum arquivo.");
        }        


    }
public BufferedImage setImagemDimensao(String caminhoImg) {
        Double novaImgLargura = null;
        Double novaImgAltura = null;
        Double imgProporcao = null;
        Graphics2D g2d = null;
        BufferedImage imagem = null, novaImagem = null;

        try {
            //--- Obtém a imagem a ser redimensionada ---
            imagem = ImageIO.read(new File(caminhoImg));
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
            JOptionPane.showMessageDialog(null, "Erro ao selecionar imagem" + ex);
        }

        //--- Obtém a largura da imagem ---  
        novaImgLargura = (double) imagem.getWidth();

        //--- Obtám a altura da imagem ---  
        novaImgAltura = (double) imagem.getHeight();

        novaImagem = new BufferedImage(novaImgLargura.intValue(), novaImgAltura.intValue(), BufferedImage.TYPE_INT_RGB);
        g2d = novaImagem.createGraphics();
        g2d.drawImage(imagem, 0, 0, novaImgLargura.intValue(), novaImgAltura.intValue(), null);

        return novaImagem;
    }

Botão de salvar

mod.setImaMulta(control.getImgBytes(img));
                    control.Salvar(mod);

Oi Giovanno,

passa tbm a expressão que vc usou no relatório.

confesso que nao sei ainda qual é o problema, mas vamos tentar resolver!

abs

La no ireport, no campo da imagem, quando vou colocar field class, ele não lista o java.awt.Image, ai eu digitei. Pode ser esse o problema? Estou usando a versão 5.6.0 do ireport

solução!

Oi Giovanni,

Ainda estou procurando uma solução.

No link abaixo do Stackoverflow, na segunda resposta, tem um código SQL para converter o bytea do PostgresSQL num string base64. Lá tbm tem a expressão para carregra a string base64 no iReport:

https://stackoverflow.com/questions/8430313/displaying-image-in-ireports-using-postgresql

Parece que o bytea do PostgresSQL não é exatamente um BLOB.

Tem como testar isso?

obrigado, Nico

Bom dia Nico, realizei o teste desse procedimento, deu super certo. Muito obrigado pela ajuda Pórem utilizei o seguinte select: SELECT encode(img_multa::bytea, 'base64') as img FROM multa

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software