Tablas en pdf


#1

Hola…

Estoy lanzando un pdf y no se como puedo hacer un bucle de tal forma que
me llene una tabla…este es el codigo q estoy utilizando:

def pdf

@clientes = Pcliente.find_all

  _pdf = PDF::Writer.new
  _pdf.select_font "Times-Roman"
  _table = PDF::SimpleTable.new
  _pdf.text "CLIENTES" , :font_size => 20, :justification => :center
  @clientes.each do |cliente|
  _pdf.text cliente.Nombre + " - " + cliente.Telefono , :font_size

=> 15, :justification => :left
_table.data = [“Nombre” => cliente.Nombre, “Telefono” =>
cliente.Telefono]
end
_table.column_order = [ “Nombre”, “Telefono” ]
_table.render_on(_pdf)

send_data _pdf.render, :filename => "clientes.pdf", :type =>

“application/pdf”
end

El resultado en la tabla es el último registro. ¿como los puedo pintar
todos?


#2

Hola, creo que te falta imprimir los saltos de línea en cada iteración.
Saludos.

Maxi

Andres wrote:

Hola…

Estoy lanzando un pdf y no se como puedo hacer un bucle de tal forma que
me llene una tabla…este es el codigo q estoy utilizando:

def pdf

@clientes = Pcliente.find_all

  _pdf = PDF::Writer.new
  _pdf.select_font "Times-Roman"
  _table = PDF::SimpleTable.new
  _pdf.text "CLIENTES" , :font_size => 20, :justification => :center
  @clientes.each do |cliente|
  _pdf.text cliente.Nombre + " - " + cliente.Telefono , :font_size

=> 15, :justification => :left
_table.data = [“Nombre” => cliente.Nombre, “Telefono” =>
cliente.Telefono]
end
_table.column_order = [ “Nombre”, “Telefono” ]
_table.render_on(_pdf)

send_data _pdf.render, :filename => "clientes.pdf", :type =>

“application/pdf”
end

El resultado en la tabla es el último registro. ¿como los puedo pintar
todos?


#3

buenas noches,
tengo el mismo problema:

“Hola, creo que te falta imprimir los saltos de línea en cada iteración”

saben como hago para soloucionarlo?

gracias


#4

Daniel R. Troitiño wrote:

2007/1/29 Andres removed_email_address@domain.invalid:

 _pdf.select_font "Times-Roman"

send_data _pdf.render, :filename => “clientes.pdf”, :type =>
“application/pdf”
end

El resultado en la tabla es el último registro. ¿como los puedo pintar
todos?

No se de donde has sacado el ejemplo, pero hay que leer la
documentación http://ruby-pdf.rubyforge.org/pdf-writer/doc/index.html,
exactamente en
http://ruby-pdf.rubyforge.org/pdf-writer/doc/classes/PDF/SimpleTable.html,
que dice:

data [RW] An array of Hash entries. Each row is a Hash where the keys
are the names of the columns as specified in column_order and the
values are the values of the cell.

Es decir data debe ser algo como:

table.data = [{“col1” => “fila 1 col 1”, “col2” => “fila 1 col2”},
{“col1” => “fila 2 col 1”, “col2” => “fila 2 col 2”}]

Si te fijas tú estás asignando a data un Array de un solo elemento
(aunque no le pongas las llaves eso es un Hash) con dos columnas, por
eso solo se ve la última fila.
Gracias por estos aportes que me han servido mucho.

ahora les pregunto, como hago para agregar una fila mas en la tabla al
final del ciclo:

table.data = clientes.map { |c| {“Nombre” => c.nombre, “Teléfono” =>
c.telefono} }

ya que el arreglo tiene una columna que debo totalizary debo imprimir al
final, entonces quiero insertar una fila, al hacerlo me borra toda la
tabla y me pone los acumulados.

por favor me ayudan?

gracias

Mi recomendación de código:

def pdf
clientes = Pcliente.find(:all) # find_all está deprecated

pdf = PDF::Writer.new # no se porqué utilizas subrayados al principio
# de las variables, pero queda feo, feo feo
pdf.select_font “Times-Roman”
pdf.text “CLIENTES”, :font_size => 20, :justification => :center
table = PDF::SimpleTable.new
table.data = clientes.map { |c| {“Nombre” => c.nombre, “Teléfono” =>
c.telefono} }
table.column_order = %w(Nombre Telefono)
table.render_on(pdf)

send_data pdf.render, :filename => “clientes.pdf”, :type =>
“application/pdf”
end

Suerte.

PD: No lo he comprobado.


#5

2007/1/29 Andres removed_email_address@domain.invalid:

 _pdf.select_font "Times-Roman"

send_data _pdf.render, :filename => “clientes.pdf”, :type =>
“application/pdf”
end

El resultado en la tabla es el último registro. ¿como los puedo pintar
todos?

No se de donde has sacado el ejemplo, pero hay que leer la
documentación http://ruby-pdf.rubyforge.org/pdf-writer/doc/index.html,
exactamente en
http://ruby-pdf.rubyforge.org/pdf-writer/doc/classes/PDF/SimpleTable.html,
que dice:

data [RW] An array of Hash entries. Each row is a Hash where the keys
are the names of the columns as specified in column_order and the
values are the values of the cell.

Es decir data debe ser algo como:

table.data = [{“col1” => “fila 1 col 1”, “col2” => “fila 1 col2”},
{“col1” => “fila 2 col 1”, “col2” => “fila 2 col 2”}]

Si te fijas tú estás asignando a data un Array de un solo elemento
(aunque no le pongas las llaves eso es un Hash) con dos columnas, por
eso solo se ve la última fila.

Mi recomendación de código:

def pdf
clientes = Pcliente.find(:all) # find_all está deprecated

pdf = PDF::Writer.new # no se porqué utilizas subrayados al principio
# de las variables, pero queda feo, feo feo
pdf.select_font “Times-Roman”
pdf.text “CLIENTES”, :font_size => 20, :justification => :center
table = PDF::SimpleTable.new
table.data = clientes.map { |c| {“Nombre” => c.nombre, “Teléfono” =>
c.telefono} }
table.column_order = %w(Nombre Telefono)
table.render_on(pdf)

send_data pdf.render, :filename => “clientes.pdf”, :type =>
“application/pdf”
end

Suerte.

PD: No lo he comprobado.


#6

¿Sabría alguien decirme como se inserta un salto de linea con el
PDF::Write? Gracias


#7

2008/8/27 Aprendiz_ror Ruby on rails
removed_email_address@domain.invalid:

ya que el arreglo tiene una columna que debo totalizary debo imprimir al
final, entonces quiero insertar una fila, al hacerlo me borra toda la
tabla y me pone los acumulados.

por favor me ayudan?

Vuelvo a ponerte la documentación, que deberías leer:

data [RW] An array of Hash entries. Each row is a Hash where the
keys
are the names of the columns as specified in column_order and the
values are the values of the cell.

Te he marcado las partes importantes con asteríscos. Lo primero es que
data es de lectura y escritura (RW, Read-Write), por lo que puedes
leerlo, escribirlo, volver a leerlo, volver a escribirlo. Segundo, es
un Array, por lo tanto tiene todos los métodos de un Array, por
ejemplo “<<” http://apidock.com/ruby/Array/<< o “push”
http://apidock.com/ruby/Array/push.

Espero que con estas indicaciones seas capaz de solucionar tu problema.

Suerte.


#8

2008/8/28 Jose antonio Parra removed_email_address@domain.invalid

¿Sabría alguien decirme como se inserta un salto de linea con el
PDF::Write? Gracias

Por favor, no secuestréis hilos. Es un no-no-no desde el principio de
los
tiempos.


#9

2008/8/27 Aprendiz_ror Ruby on rails removed_email_address@domain.invalid

Daniel R. Troitiño wrote:

ahora les pregunto, como hago para agregar una fila mas en la tabla al
final del ciclo:

table.data = clientes.map { |c| {“Nombre” => c.nombre, “Teléfono” =>
c.telefono} }

Hola,

en lo posible vamos a evitar situaciones como estas, en la que Daniel ha
tenido que escribir dos emails, e invertido el doble de tiempo, para
solucionar algo que a) estaba en la documentación y b) estaba en el
trozo
concreto de documentación que él te envió en primer lugar. Hay que ser
respetuoso con los que intentan ayudar.


#10

Gracias, asi lo solucione

table.data.push(“Factura” => ‘Totales’, “Valor” => t_subt, “Iva” =>
t_iva, “Total” => t_neto, “Nota” => nota)

Daniel R. Troitiño wrote:

2008/8/27 Aprendiz_ror Ruby on rails
removed_email_address@domain.invalid:

ya que el arreglo tiene una columna que debo totalizary debo imprimir al
final, entonces quiero insertar una fila, al hacerlo me borra toda la
tabla y me pone los acumulados.

por favor me ayudan?

Vuelvo a ponerte la documentación, que deberías leer:

data [RW] An array of Hash entries. Each row is a Hash where the
keys
are the names of the columns as specified in column_order and the
values are the values of the cell.

Te he marcado las partes importantes con asteríscos. Lo primero es que
data es de lectura y escritura (RW, Read-Write), por lo que puedes
leerlo, escribirlo, volver a leerlo, volver a escribirlo. Segundo, es
un Array, por lo tanto tiene todos los métodos de un Array, por
ejemplo “<<” http://apidock.com/ruby/Array/<< o “push”
http://apidock.com/ruby/Array/push.

Espero que con estas indicaciones seas capaz de solucionar tu problema.

Suerte.


#11

generar un pdf con table = PDF::SimpleTable.new

es muy demorado, genere una tabla de 7.000 registros y me demoro una
hora, estos mismos registros los genere con:

pdf.text
h.factura.to_s+"\t\t\t"+subtotal.to_s+"\t\t\t"+iva.to_s+"\t\t\t"+total.to_s+"\t\t\t"+nota

el problema es que no se como tabular en columnas la informacion, por
favor me ayudan

gracias