Amigo,
resolvi este problema da seguinte forma:
package br.com.jm.ss2.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.util.HashMap;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
public class GeraRelatorioEmHTML extends HttpServlet {
private final static long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String nomeDoRelatorio = request.getParameter("nomeRelatorio");
//List lista = (List) request.getAttribute("lista");
HashMap<String, String> parametros = (HashMap<String, String>) request
.getAttribute("parametros");
ServletContext context = this.getServletContext();
String nomeDoArquivoCompilado = context.getRealPath(nomeDoRelatorio);
File arquivo = new File(nomeDoArquivoCompilado);
PrintWriter printWriter = response.getWriter();
try {
JasperReport relatorioCompilado = (JasperReport) JRLoader
.loadObject(arquivo);
//JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
// lista);
IRelatorios rel = new RelatoriosDao();
Connection con = rel.getConnection();
JasperPrint relatorioFinal = JasperFillManager.fillReport(
relatorioCompilado, parametros, con);
JRHtmlExporter htmlExporter = new JRHtmlExporter();
response.setContentType("text/html");
response.setCharacterEncoding("ISO-8859-1");
request.getSession().setAttribute(
ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
relatorioFinal);
htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT,
relatorioFinal);
htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER,
printWriter);
htmlExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,
"ISO-8859-1");
/*
* aqui é mapeado para o servlet do JasperReport, para que ao gerar o
* html não renderize as imagens em branco, pois os espaços em branco,
* são imagens em branco que ele adiciona!
* Basta adicionar no web.xml a chamada ao servlet que existe no pacote:
*
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/image.servlet</url-pattern>
</servlet-mapping>
*
*/
htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
request.getContextPath() + "/image.servlet?image=");
htmlExporter.exportReport();
// printWriter.println("Passou por aqui");
} catch (JRException e) {
e.printStackTrace(printWriter);
}
}
}
Observe na linha:
htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
request.getContextPath() + "/image.servlet?image=");
Que eu mapeio um servlet.
Este servlet está nas lib´s do JasperReport, para usá-la basta criar um mapeamento para o servlet no web.xml:
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/image.servlet</url-pattern>
</servlet-mapping>
Que desta forma os espaços em branco que o JasperReport renderiza com uma imagem, serão renderizados com a imagem mesmo e não mais com o erro de imagem que acontecia!
Espero ter ajudado, abraços…