Olá, criei um novo método para imprimir multiplos boletos em um único arquivo. No meu caso coloquei no arquivo rghost.rb. Tentei fazer com class_eval, redefinindo a classe, e tudo mais, mas há um problema pelo uso da constante FILE, então de qualquer forma a única alternativa era modificar o arquivo rghost.rb, resolvi já colocar tudo lá.
template_path = File.join(File.dirname(__FILE__),'..','..','arquivos','templates','modelo_generico.eps')
raise "Não foi possível encontrar o template. Verifique o caminho" unless File.exist?(template_path)
# Busca logo automaticamente
logo = monta_logo
doc.define_tags do
tag :grande, :size => 13
end
boletos.each_with_index{ |bol, index|
doc.define_template(:template, template_path, :x => '0.3 cm', :y => "0 cm")
doc.use_template :template
#INICIO Primeira parte do BOLETO
# LOGOTIPO do BANCO
doc.image(logo, :x => '0.5 cm', :y => '23.85 cm', :zoom => 80) if logo
# Dados
doc.moveto :x => '5.2 cm' , :y => '23.85 cm'
doc.show "#{bol.banco}-#{bol.banco_dv}", :tag => :grande
doc.moveto :x => '7.5 cm' , :y => '23.85 cm'
doc.show bol.codigo_barras.linha_digitavel, :tag => :grande
doc.moveto :x => '0.7 cm' , :y => '23 cm'
doc.show bol.cedente
doc.moveto :x => '11 cm' , :y => '23 cm'
doc.show bol.agencia_conta_boleto
doc.moveto :x => '14.2 cm' , :y => '23 cm'
doc.show bol.especie
doc.moveto :x => '15.7 cm' , :y => '23 cm'
doc.show bol.quantidade
doc.moveto :x => '0.7 cm' , :y => '22.2 cm'
doc.show bol.numero_documento
doc.moveto :x => '7 cm' , :y => '22.2 cm'
doc.show "#{bol.documento_cedente.formata_documento}"
doc.moveto :x => '12 cm' , :y => '22.2 cm'
doc.show bol.data_vencimento.to_s_br
doc.moveto :x => '16.5 cm' , :y => '23 cm'
doc.show bol.nosso_numero_boleto
doc.moveto :x => '16.5 cm' , :y => '22.2 cm'
doc.show bol.valor_documento.to_currency
doc.moveto :x => '1.4 cm' , :y => '20.9 cm'
doc.show "#{bol.sacado} - #{bol.sacado_documento.formata_documento}"
doc.moveto :x => '1.4 cm' , :y => '20.6 cm'
doc.show "#{bol.sacado_endereco}"
#FIM Primeira parte do BOLETO
#INICIO Segunda parte do BOLETO BB
# LOGOTIPO do BANCO
doc.image(logo, :x => '0.5 cm', :y => '16.8 cm', :zoom => 80) if logo
doc.moveto :x => '5.2 cm' , :y => '16.8 cm'
doc.show "#{bol.banco}-#{bol.banco_dv}", :tag => :grande if bol.banco && bol.banco_dv
doc.moveto :x => '7.5 cm' , :y => '16.8 cm'
doc.show bol.codigo_barras.linha_digitavel, :tag => :grande if bol.codigo_barras && bol.codigo_barras.linha_digitavel
doc.moveto :x => '0.7 cm' , :y => '16 cm'
doc.show bol.local_pagamento if bol.local_pagamento
doc.moveto :x => '16.5 cm' , :y => '16 cm'
doc.show bol.data_vencimento.to_s_br if bol.data_vencimento
doc.moveto :x => '0.7 cm' , :y => '15.2 cm'
doc.show bol.cedente if bol.cedente
doc.moveto :x => '16.5 cm' , :y => '15.2 cm'
doc.show bol.agencia_conta_boleto
doc.moveto :x => '0.7 cm' , :y => '14.4 cm'
doc.show bol.data_documento.to_s_br if bol.data_documento
doc.moveto :x => '4.2 cm' , :y => '14.4 cm'
doc.show bol.numero_documento if bol.numero_documento
doc.moveto :x => '10 cm' , :y => '14.4 cm'
doc.show bol.especie if bol.especie
doc.moveto :x => '11.7 cm' , :y => '14.4 cm'
doc.show bol.aceite if bol.aceite
doc.moveto :x => '13 cm' , :y => '14.4 cm'
doc.show bol.data_processamento.to_s_br if bol.data_processamento
doc.moveto :x => '16.5 cm' , :y => '14.4 cm'
doc.show bol.nosso_numero_boleto
doc.moveto :x => '4.4 cm' , :y => '13.5 cm'
doc.show bol.carteira if bol.carteira
doc.moveto :x => '6.4 cm' , :y => '13.5 cm'
doc.show bol.moeda if bol.moeda
doc.moveto :x => '8 cm' , :y => '13.5 cm'
doc.show bol.quantidade if bol.quantidade
doc.moveto :x => '11 cm' , :y => '13.5 cm'
doc.show bol.valor.to_currency if bol.valor
doc.moveto :x => '16.5 cm' , :y => '13.5 cm'
doc.show bol.valor_documento.to_currency if bol.valor_documento
doc.moveto :x => '0.7 cm' , :y => '12.7 cm'
doc.show bol.instrucao1 if bol.instrucao1
doc.moveto :x => '0.7 cm' , :y => '12.3 cm'
doc.show bol.instrucao2 if bol.instrucao2
doc.moveto :x => '0.7 cm' , :y => '11.9 cm'
doc.show bol.instrucao3 if bol.instrucao3
doc.moveto :x => '0.7 cm' , :y => '11.5 cm'
doc.show bol.instrucao4 if bol.instrucao4
doc.moveto :x => '0.7 cm' , :y => '11.1 cm'
doc.show bol.instrucao5 if bol.instrucao5
doc.moveto :x => '0.7 cm' , :y => '10.7 cm'
doc.show bol.instrucao6 if bol.instrucao6
doc.moveto :x => '1.2 cm' , :y => '8.8 cm'
doc.show "#{bol.sacado} - #{bol.sacado_documento.formata_documento}" if bol.sacado && bol.sacado_documento
doc.moveto :x => '1.2 cm' , :y => '8.4 cm'
doc.show "#{bol.sacado_endereco}" if bol.sacado_endereco
#FIM Segunda parte do BOLETO
#Gerando codigo de barra com rghost_barcode
doc.barcode_interleaved2of5(bol.codigo_barras, :width => '10.3 cm', :height => '1.3 cm', :x => '0.7 cm', :y => '5.8 cm' ) if bol.codigo_barras
#Cria nova página se não for o ultimo boleto
doc.next_page unless index == boletos.length-1
}
# Gerando stream
options[:tipo] = options[:tipo].to_sym unless options[:tipo].kind_of?(Symbol)
doc.render_stream(options[:tipo])
end
Não está dos melhores, e não sei se foi o melhor lugar para fazer isso, mas de qualquer forma, resolveu meu problema de forma fácil. O ruim é que precisa instanciar um outro boleto do mesmo tipo dos boletos incluidos. Por exemplo:
Enfim... segue a idéia, quem sabe consigam implementar de uma melhor forma.
Valeu, abraço, e obrigado pela biblioteca excelente.