Boa tarde, não estou conseguindo exibir uma imagem no ireport. A imagem esta no banco de dados postgres em um campo tipo bytea
Boa tarde, não estou conseguindo exibir uma imagem no ireport. A imagem esta no banco de dados postgres em um campo tipo bytea
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
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