Jasper on Rails

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”?

Advertisements
This entry was posted in Ruby and tagged , , , , . Bookmark the permalink.

4 Responses to Jasper on Rails

  1. Eleudson says:

    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?

    • 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.

  2. Wander says:

    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

  3. Paulo C. D. says:

    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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s