Esses dias comecei a estudar como integrar algum sistema de relatório ao Rails. O problema principal é que nenhum sistema de relatórios possui editor visual (para Layout, essas coisas fazem uma diferença…). Felizmente, existe o Jasper, com o iReport que é um editor visual. O problema é que ele é em Java… a solução é que existe JRuby!

Mas, como integrar bem essas duas tecnologias?

Estou montando, agora, um software aonde vai ser possível incluir relatórios, e depois com uma chamada RESTful o Jasper montará seu relatório. Para os que estão curiosos, para montar um relatório com JRuby basta seguir os seguintes passos:

  • Descompacte o pacote Jasper. Crie um relatório para usar formato XML;
  • Crie um aplicativo JRuby, e inclua a biblioteca .jar do Jasper, e todas as bibliotecas que estiverem no diretório lib do Jasper.
  • O aplicativo deverá conter o que segue:
java_import Java::net::sf::jasperreports::engine::xml::JRXmlLoader
java_import Java::net::sf::jasperreports::engine::JasperManager
java_import Java::net::sf::jasperreports::engine::JasperExportManager
java_import Java::net::sf::jasperreports::engine::JasperFillManager
java_import Java::net::sf::jasperreports::engine::query::JRXPathQueryExecuterFactory
java_import Java::net::sf::jasperreports::engine::util::JRXmlUtils
java_import Java::net::sf::jasperreports::engine::util::JRLoader
java_import Java::net::sf::jasperreports::engine::util::xml::JRXPathExecuterFactory

arquivo = '<seu_relatorio>.jasper'
string = File.read('<dados_para_o_relatorio>.xml')

documento = JRXmlUtils.parse(
  Java::org.xml.sax::InputSource.new(
    Java::java::io::StringReader.new(string)
  )
)

params = { JRXPathQueryExecuterFactory::PARAMETER_XML_DATA_DOCUMENT => documento }

fill = JasperFillManager.fill_report(arquivo, params)
pdf = JasperExportManager.export_report_to_pdf(fill)

File.open('<relatorio>.pdf', 'wb') do |arq|
  arq.print(String.from_java_bytes(pdf))
end

Substitua as “tags” pelos seus arquivos, obviamente. Basicamente, o programa lê o arquivo de relatório, lê o arquivo de dados (os dados que você quer passar ao relatório, em formato XML), preenche o relatório (com o FILL) e depois cria um arquivo .pdf. A grande vantagem do Jasper é que ele suporta arquivos de Word, PDF, Excel, CSV, XML, e mais um monte de formatos. Até o momento eu consegui montar um pequeno projeto, aonde você coloca seus relatórios num diretório específico, e com uma chamada (GET) ele monta um relatório… o projeto está hospedado no meu github (http://github.com/mauricioszabo/jasper_on_rails). Alguém conhece algum plugin/aplicativo Rails que permite acessar uma pasta qualquer como se fosse um daqueles “discos virtuais”?


4 Comments

Eleudson · 2009-11-07 at 13:50

Maurício, legal seu post, principalmente porque também estamos integrando o Jasper com JRuby.

Uma dúvida que tenho é como você configura o relatório no iReport para receber e utilizar os dados em XML. Você pode me ajudar?

    Maurício Szabo · 2009-11-16 at 20:28

    Bom, é bem simples na verdade: basta criar um relatório, e no relatório tem uma opção Language for dataset query. Basta colocar xPath, e na configuração de DataSources escolher XML Datasource.

    Para buscar os dados no XML você precisa usar xPath, procura no w3schools.com que lá tem uns tutoriais.

Wander · 2010-09-09 at 12:28

Ola, legal a possibilidade de utilizar jasper com rails. Mas nao entendi se o seu projeto no github funciona como plugin ou apenas eh um codigo de exemplo,

nao entendi tambem como passar os dados de parametro para o relatorio, no caso do exemplo alunos.xml

grato,

Wander

Paulo C. D. · 2010-12-06 at 13:32

Maurício

Como posso colocar o código para que este leia a url do xml em vez de um arquivo na raiz.

string = File.read(‘.xml’)

Trocar este File.read para a url, ex.: localhosta:3000/customers.xml

Comments are closed.