Dica do dia:

Olha que maravilha... Esses dias no trabalho eu estava precisando exibir/imprimir Gráficos do Flex em pdf, e achei uma solução simples... Como eu ja tinha toda uma estrutura disponível e padronizada, resolvi enviar um Snapshot do gráfico para um servlet e utilizar a infra do Jasper para exibi-los. Como fiz isso? Transformei um bitmap do gráfico em String codificada na base 64 e enviei via post para o servlet, e decodifiquei a String convertendo em um array de bytes para criar uma Image, e por fim passei por parâmetro para o meu relatorio jasper.
//FLEX
/**
* Esse metodo recebe o parametro ChartBase (seu relatorio) retorna o Snapshot do grafico convertido em uma String.
* É criado BitmapData com as dimensões do gráfico, que codificado (PNGEncoder) em um ByteArray
* e depois codificado na Base 64.
*/
public function getSnapshot(source :ChartBase):String{
var bmp:BitmapData;
bmp = new BitmapData(source.width,source.height);
bmp.draw(source);
var encoderMan : PNGEncoder = new PNGEncoder();
var byteArr:ByteArray = encoderMan.encode(bmp);
var 64Encoder:Base64Encoder = new Base64Encoder();
64Encoder.encodeBytes(byteArr);
return 64Encoder.toString();//flush()
}
/**
* Aqui eu invoco o método getSnapshot, setando o seu retorno em param.data , e envio via POST(ou GET) para meu servlet ou php
*/
public function sendImageString(chart :ChartBase):void{
var header:URLRequestHeader = new URLRequestHeader();
var param:URLVariables = new URLVariables();
param.data = getSnapshot(chart);
var urlRequest:URLRequest = new URLRequest("MINHA URL");
urlRequest.requestHeaders.push(header);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = param;
navigateToURL(urlRequest, "_blank");
}
No IReport crie um parâmetro IMG_GRAFICO do tipo java.awt.Image em seu Relatório, e adicione uma Imagem no Details (ou no lugar desejado)
e configure suas propriedades como na imagem abaixo, passando o $P{IMG_GRAFICO} na Image Expression.
Feito isso no meu Servlet eu precisarei fazer com que eu receba esse parâmetro e converta a String em Image:
//JAVA
public class MeuServlet extends HttpServlet {
public MeuServlet(){}
/**
* Este metodo recebe o HttpServletRequest e recupera o parâmetro data que contém a imagem transformada em String.
* Ele decodifica a Base 64 em um byte[] e retorna o ImageIcon.
*
*/
public ImageIcon converteStringToImage(HttpServletRequest request){
String imageDataString = request.getParameter("data");
byte[] imageByteArray = decodeImage(imageDataString);
return new ImageIcon(imageByteArray);
}
/**
* Decodifica a String da imagem na base64 retornando um array de bytes
*
* @param dataString
* - a {@link java.lang.String}
* @return byte array
* @throws IOException
*/
public byte[] decodeImage(String dataString) throws IOException {
BASE64Decoder decoder = new BASE64Decoder();
return decoder.decodeBuffer(dataString);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//Map(object,object) de Parametro que será utilizado pelo Relatorio Jasper.
ImageIcon imageIcon = converteStringToImage(request,response, this.getServletContext());
parametros.put("IMG_GRAFICO", imageIcon.getImage()); // Add a Image ao parâmetro do Relatório
// ... Invocação do Relatório....
}
}

