¿Cómo creo filas con rayas (cebra) en una tabla?
Pasa template.TableStripe a la llamada Table. gpdf pinta las filas alternas del cuerpo con el color que le des. Sin bucle de filas, sin estilos celda a celda.
La pregunta, en otras palabras
Tengo una tabla — facturas, transacciones, líneas de log, cualquier cosa con más de 5 filas — y quiero que cada otra fila se tinte de gris para que la vista pueda seguir la línea sin perderse. Bootstrap lo llama .table-striped. Quiero exactamente eso, en gpdf, sin escribir un bucle de filas.
Respuesta breve
c.Table(header, rows, template.TableStripe(pdf.RGBHex(0xF5F5F5)))
Eso es todo. gpdf gestiona la alternancia. La cabecera queda excluida; sólo se rayan las filas del cuerpo. La primera fila del cuerpo queda limpia, la segunda con tinte, la tercera limpia, la cuarta con tinte, y así sucesivamente.
Código que funciona
package main
import (
"log"
"os"
"github.com/gpdf-dev/gpdf"
"github.com/gpdf-dev/gpdf/document"
"github.com/gpdf-dev/gpdf/pdf"
"github.com/gpdf-dev/gpdf/template"
)
func main() {
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithMargins(document.UniformEdges(document.Mm(20))),
)
brand := pdf.RGBHex(0x1A237E) // fondo de cabecera
stripe := pdf.RGBHex(0xF5F5F5) // tinte fila a fila
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("Ventas Q1", template.FontSize(20), template.Bold())
c.Spacer(document.Mm(4))
c.Table(
[]string{"Producto", "Región", "Cant.", "Ingresos"},
[][]string{
{"Laptop Pro 15", "NA", "120", "155.880 €"},
{"Wireless Mouse", "EU", "640", "19.193 €"},
{"USB-C Hub", "APAC", "410", "20.495 €"},
{"Monitor 27\"", "NA", "180", "71.820 €"},
{"Keyboard", "EU", "320", "25.596 €"},
{"Webcam HD", "APAC", "260", "23.397 €"},
},
template.ColumnWidths(40, 20, 15, 25),
template.TableHeaderStyle(
template.TextColor(pdf.White),
template.BgColor(brand),
),
template.TableStripe(stripe),
)
})
})
data, err := doc.Generate()
if err != nil {
log.Fatal(err)
}
if err := os.WriteFile("ventas.pdf", data, 0o644); err != nil {
log.Fatal(err)
}
}
go run main.go. Seis filas en el cuerpo, tres tintadas, cabecera azul oscuro con texto blanco. El típico informe que se manda por correo el lunes a primera hora.
Cómo funciona la alternancia
Internamente, gpdf recorre las filas del cuerpo con un índice i que empieza en 0 y aplica la raya a las filas donde i%2 == 1. La cabecera vive en otro slice y no entra en el conteo.
| Índice de fila (base 0) | Visualmente | ¿Rayada? |
|---|---|---|
| 0 | 1.ª | no |
| 1 | 2.ª | sí |
| 2 | 3.ª | no |
| 3 | 4.ª | sí |
| ... | ... | ... |
Esa paridad coincide con la convención de Bootstrap. La primera fila de datos queda limpia y la raya actúa como una "pausa" visual: el ojo cruza la fila blanca, la siguiente está sombreada, y así sucesivamente.
No hay opción para invertir la paridad (rayar las filas con índice par). Si de verdad la quieres invertida, antepón una fila vacía al cuerpo — pero no lo harás, porque nadie quiere realmente ese efecto.
Elegir el color
El propósito es ser sutil. Una raya lo bastante fuerte para competir con el texto se autoderrota.
pdf.RGBHex(0xF5F5F5) // gris cálido suave — territorio del valor por defecto de Bootstrap
pdf.RGBHex(0xFAFAFA) // todavía más suave, casi imperceptible a tamaños pequeños
pdf.RGBHex(0xEEF2FF) // tinte pálido de marca (funciona si la cabecera es del color de marca)
pdf.Gray(0.96) // equivalente en escala de grises — ahorra unos bytes en flujos PDF/A
Evita colores saturados. Una raya azul al 60 % de saturación se lee como "esta fila está seleccionada/es importante" y rompe el barrido transversal que el rayado cebra debería resolver.
Para temas oscuros (raros en PDF, pero existen en informes tipo presentación), pdf.RGBHex(0x202020) sobre una página 0x1A1A1A funciona. Mantén la diferencia de contraste baja.
Combina con bordes de celda
Las rayas solas bastan para tablas cortas. Para tablas densas, tipo financiero, combina las rayas con WithTableCellBorder para dibujar un hilo entre cada celda:
hairline := template.Border(
template.BorderWidth(document.Pt(0.5)),
template.BorderColor(pdf.Gray(0.85)),
)
c.Table(header, rows,
template.ColumnWidths(40, 20, 15, 25),
template.TableHeaderStyle(
template.TextColor(pdf.White),
template.BgColor(brand),
),
template.TableStripe(pdf.RGBHex(0xF5F5F5)),
template.WithTableCellBorder(hairline),
)
Bordes finos + raya clara = el aspecto de cualquier vista previa de impresión de hoja de cálculo de contabilidad, a propósito. Mantén el borde más claro que la raya para que la raya siga siendo la señal dominante.
Si sólo quieres un marco exterior (sin cuadrícula interior), cambia WithTableCellBorder por WithTableBorder.
Errores que cuestan diez minutos
- Color en el rango incorrecto.
pdf.RGB(245, 245, 245)produce un cuadro negro. El constructor espera 0.0–1.0, no 0–255. Usapdf.RGBHex(0xF5F5F5)si piensas en valores CSS. - Rayar la cabecera.
TableStripeno toca la cabecera. Si quieres una cabecera con tinte, eso esTableHeaderStyle(template.BgColor(...))— otra opción distinta. Confundir las dos y luego preguntarse por qué la cabecera no aparece tintada es el error clásico de la primera vez. - Alternancia de dos colores. gpdf admite un único color de raya, no dos. Si te imaginas un ciclo
[blanco, gris, azul]— no es una funcionalidad y tampoco sería amable con el lector. - Rayar una tabla de 3 filas. Una raya necesita al menos 4–5 filas en el cuerpo para hacer su trabajo. Con 2–3 filas parece que se ha seleccionado una celda por accidente. Sáltatela; deja que la tabla respire.
Recetas relacionadas
- ¿Cómo defino anchos de columna personalizados en una tabla? —
ColumnWidthsen detalle. - ¿Cómo añado una fuente TrueType propia a gpdf? — renderiza la tabla rayada con la tipografía de marca.
- Genera una factura PDF en Go en menos de 50 líneas — tabla real con cabecera estilizada, rayas y totales.
Prueba gpdf
gpdf es una librería Go para generar PDFs. Licencia MIT, cero dependencias externas, manejo TrueType en Go puro.
go get github.com/gpdf-dev/gpdf