É 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 ???
Ler Imagens do BD no Ireport/Jasper [ RESOLVIDO ]
5 Respostas
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.
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,
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)
Já tentou assim
parametros.put("classe", new ImagenJasperAction());
[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 !!!