Olá pessoal to com um problema que nao sei resolver que e sobre o Ireport.
Quero construir um relatorio que me traga os dados do banco e quero tbm trazer uma imagem com eles entao
para cada registro no banco diferente uma imagem.
Obrigado pela atenção.
vlw
abs
[Ajuda]Ireport com imagens para cada registro[Resolvido!]
11 Respostas
Mas a imagem esta no banco ou só o endereco?
Tenho um sub-relatorio que traz uma imagem para cada linha, porem eu tinha os nomes das imagens e gerava o inputStream da imagem e setava no objeto da linha, entao quando passo para o relatorio a lista ja tem as imagens para exibir no sub-relatorio.
bom . e seguinte eu tenho o endereço da imagen mais o nome da imagen e justamente um valor do campo que esta no banco fica +/- assim:
Banco: valor_banco = nome ; e relaorio imagens = /caminho/+Variavel valor_banco+.jpg
entao quero o seguinte para cada registro um imagem com aquela foto
vlw
abs
Nao sei se é a melhor maneira de se fazer mas aqui funcionou.
Coloque um atributo InputStream na sua classe, nao precisa persisti-lo nao, só ‘transient’ mesmo.
Quando tiver a sua lista de objetos a exibir, faça assim:
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
for (MeuObjeto obj : lista) {
InputStream stream = context.getResourceAsStream(obj.getImagem());
obj.setStream(stream)
}
No iReport voce cria um campo que recebe um InputStream, e como ele vem de um atributo do seu objeto a chamada fica igual a qualquer outra.
cara desculpe mais nao entedir!!!
vc quer minha classe? assim pode ficar facil de vc me mostar como implementar o q vc postou!!
vlw
Posta seu codigo por favor.
while((rs.next())){
setX( rs.getInt("cx")-200);
setY( rs.getInt("cy")-200);
setX_( rs.getInt("cx_")-200);
setY_( rs.getInt("cy_")-200);
int nnn = (rs.getInt("sequencia"));
setSequencia(rs.getString("sequencia"));
Graphics2D g1 = imagem.createGraphics();
g1.setColor(Color.WHITE);
//g1.drawRect(0,0,820, 677);
g1.fillRect(0,0, 820, 677);
g1.setFont(bigFont);
g1.drawString("Pontos",80,20);
g.setFont(bigFont);
g.drawString("Pontos",80,20);
if(nnn == 1){
g1.setColor(Color.LIGHT_GRAY);
g1.fillArc(getX(),getY(),20,20,0,360);
g1.setColor(Color.black);
g1.drawString(getSequencia(), getX()+4,getY()+15);
if(nnn > 1){
g1.setColor(Color.white);
g1.drawLine(getX_()+12,getY_()+12,getX()+12,getY()+12);
if(lum.equals("PST")){
g1.fillArc(getX(),getY(),20,20,0,360);
//g.fillArc(getX(),getY(),20,20,0,360);
//
g1.setColor(Color.black);
g1.drawString(getSequencia(), getX()+4,getY()+15);
}else{
g1.setColor(Color.magenta);
g1.fillArc(getX(),getY(),20,20,0,360);
g1.setColor(Color.black);
g1.drawString(getSequencia(), getX()+4,getY()+15);
setXy1 (new ArrayList<Integer>());
getXy1().add(getX());
setYx2(new ArrayList<Integer>());
getYx2().add(getY());
//xy.add(getY());
//xy.add(getN());
setN(new ArrayList<Integer>());
getN().add(nnn);
setRes(true);
}
}
g1.setPaint(Color.white);
g1.dispose();
ImageIO.write(imagem, "jpg", new File("C:/export.jpg"));
}
}
Neste codigo voce esta criando a imagem, entao ela nao vem do banco, voce a cria antes de gerar o relatorio?
Se for isso, segundo o topico http://www.guj.com.br/posts/list/76219.java
O seguinte codigo converte um BufferedImage em um InputStream:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
int quality = 100; // Use between 1 and 100, with 100 being hest quality
quality = Math.max(0, Math.min(quality, 100));
param.setQuality((float)quality / 100.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);
InputStream is = new ByteArrayInputStream(bos.toByteArray());
Agora guarde este inputStream na lista que será mandada ao jasper.
sim!!
Acabei editando o post mas veja se aquilo te serve, tinha postado o codigo que uso, pegando atraves do faces o inputStream, agora postei um que serve para o seu codigo eu acho.
ok
Obrigado pela atenção vou fazer ums testes depois!!!
To fazendo de outra maneira pra ver se dar certo!!!
vlw
abs
Obrigado vi-gb pela ajuda!!!
eu ultilizei os Grupos no Ireport para fazer isso!!!
vlw
abs