Ler Imagens do BD no Ireport/Jasper [ RESOLVIDO ]

5 respostas
F

É possivel ler uma imagem que esta armazenada em um campo do tipo BLOB no BD e mostrar a mesma em um relatório usando o Jasper ???

5 Respostas

furutani

Sim é possivel.
Você tem que criar uma classe que implementa JRRenderable e sobreescrever o método getImageData(), nesse método leia o BLOB.
No iReport você deve indicar para o elemento Imagem que o tipo dele será JRRenderable. Você pode passar essa classe via parametro ou data source dependendo do uso que você vai dar a esta imagem.

F

Boa tarde furutani,

Quase entendi… como eu passo uma classe como paramentro ? Ou eu passo um objeto da classe e com ele acesso o metodo getImageData() ?

Sds,

F

furutani:
Sim é possivel.
Você tem que criar uma classe que implementa JRRenderable e sobreescrever o método getImageData(), nesse método leia o BLOB.
No iReport você deve indicar para o elemento Imagem que o tipo dele será JRRenderable. Você pode passar essa classe via parametro ou data source dependendo do uso que você vai dar a esta imagem.

tentei fazer o que eu acho q entendi… olha só:

package sos.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.apache.log4j.Logger;

public class ImagenJasperDao {
	
	private DAO dao;
	private static Logger logger = Logger.getLogger(ImagenJasperDao.class);
	public ImagenJasperDao(DAO dao) {
		this.dao = dao;
	}
	
	public byte[] lerImagemBD(){
		byte[] imagem = null;
		try{
			String query = "SELECT IMG1 FROM m_usadas WHERE ID = 358";
			PreparedStatement sql = dao.getPreparedStatement(query);
			ResultSet rs = sql.executeQuery();
			if(rs.next()){
				imagem = rs.getBytes("IMG1");
				
			}

		}catch (Exception e) {
			System.out.println(e);
		}
		return imagem;
	}
	
	
	

}



package sos.action;

import java.awt.Graphics2D;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sos.dao.DAO;
import sos.dao.ImagenJasperDao;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRenderable;

public class ImagenJasperAction implements JRRenderable {
	
	private HttpServletRequest getRequest()
	{
		FacesContext faces=FacesContext.getCurrentInstance();
		ExternalContext external=faces.getExternalContext();
		HttpServletRequest request=(HttpServletRequest)external.getRequest();
		return request;
	}
	private HttpServletResponse getResponse()
	{
		FacesContext faces=FacesContext.getCurrentInstance();
		ExternalContext external=faces.getExternalContext();
		HttpServletResponse response=(HttpServletResponse) external.getResponse();
		return response;
	}

	@Override
	public Dimension2D getDimension() throws JRException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getId() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public byte[] getImageData() throws JRException {
		byte[] imagen;
		DAO dao = new DAO();
		ImagenJasperDao imDao = new ImagenJasperDao(dao);
		imagen = imDao.lerImagemBD();
		return imagen;
	}

	@Override
	public byte getImageType() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public byte getType() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void render(Graphics2D arg0, Rectangle2D arg1) throws JRException {
		// TODO Auto-generated method stub
		
	}
	
	

}


Map<String, Object> parametros=new HashMap<String, Object>();
			
			parametros.put("SUBREPORT_DIR",caminho);
			parametros.put("classe", ImagenJasperAction.class);
			JasperPrint jasper;
			jasper=JasperFillManager.fillReport(caminho+"sos_sub.jasper",parametros,dao.getConexao());
			HttpServletResponse response=getResponse();
			response.setContentType("application/pdf");
			response.setHeader("Content-disposition", "inline");

			response.setHeader("Cache-Control", "nocache");
			response.setHeader("Pragma", "public");
			



erro :

net.sf.jasperreports.engine.JRException: Incompatible java.lang.Class value assigned to parameter classe in the sos_sub dataset.
	at net.sf.jasperreports.engine.fill.JRFillDataset.setParameter(JRFillDataset.java:895)
	at net.sf.jasperreports.engine.fill.JRFillDataset.setFillParameterValues(JRFillDataset.java:652)
	at net.sf.jasperreports.engine.fill.JRFillDataset.setParameterValues(JRFillDataset.java:603)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1197)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:842)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:795)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:234)
	at sos.action.SosAction.gerarEtiquetas(SosAction.java:342)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132)
	at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)
	at javax.faces.component.UICommand.broadcast(UICommand.java:109)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processEvents(AjaxViewRoot.java:274)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:250)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processApplication(AjaxViewRoot.java:405)
	at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
	at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:75)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:213)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Unknown Source)
furutani

Já tentou assim

parametros.put("classe", new ImagenJasperAction());
F

[quote=furutani]Já tentou assim

parametros.put("classe", new ImagenJasperAction());

Bom dia furutani !

Fiz dessa forma que vc me passo… ai recebi o parametro no jasper como java.lang.Object , no campo imagem vinculei o parametro e disse que seria do tipo JRRenderable.

FUNCIONOU PERFEITAMENTE !!!

Só mais uma perguntinha: É melhor fazer dessa forma ou carregar uma imagem de um diretorio da aplicação ?

Muito Obrigado pela sua ajuda !!!

Criado 13 de agosto de 2009
Ultima resposta 14 de ago. de 2009
Respostas 5
Participantes 2