usando tutorial para librerias generar exportar espaƱol ejemplos documentos desde crear como python pdf gradient reportlab

tutorial - reportlab python install



Crear un relleno de degradado en un archivo PDF usando el informe (3)

ReportLab ahora admite gradientes de PDF.

El 6 de agosto de 2012, Peter Johnson publicó en la lista de correo de ReportLab un parche para soporte de degradado y se agregó a la fuente al día siguiente. No puedo encontrar nada en las notas de la versión de ReportLab 2.6 pero, dado que fue lanzado el 1 de octubre de 2012, presumiblemente está ahí. Está definitivamente presente en 2.7.

Se pueden especificar tanto gradientes lineales como radiales con paradas múltiples. La búsqueda de la documentación del término degradado no arroja nada. Sin embargo, el mensaje con la primera versión del parche tiene un par de ejemplos que son la base de algunas pruebas en el origen de ReportLab . Basado en esto, he desarrollado un script de demostración rápido:

from reportlab.pdfgen.canvas import Canvas from reportlab.lib.colors import red, yellow, green from reportlab.lib.units import mm c = Canvas("gradient.pdf") # Linear gradient with the endpoints extending over the page. c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow)) c.drawString(5*mm, 290*mm, "c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow))") c.line(105*mm, 200*mm, 180*mm, 100*mm) c.showPage() # Linear gradient constrained within the endpoints. c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow), extend=False) c.drawString(5*mm, 290*mm, "c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow), extend=False)") c.line(105*mm, 200*mm, 180*mm, 100*mm) c.showPage() # Linear gradient with multiple stops. c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow, green), (0, 0.8, 1), extend=False) c.drawString(5*mm, 290*mm, "c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow, green), (0, 0.8, 1), extend=False)") c.line(105*mm, 200*mm, 180*mm, 100*mm) c.line(141*mm, 102*mm, 189*mm, 138*mm) c.showPage() # Radial gradient with the endpoint extending over the page. c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow)) c.drawString(5*mm, 290*mm, "c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow))") c.circle(105*mm, 200*mm, 60*mm) c.showPage() # Radial gradient constrained within the circle. c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow), extend=False) c.drawString(5*mm, 290*mm, "c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow), extend=False)") c.circle(105*mm, 200*mm, 60*mm) c.showPage() # Radial gradient with multiple stops. c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow, green), (0, 0.8, 1)) c.drawString(5*mm, 290*mm, "c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow, green), (0, 0.8, 1))") c.circle(105*mm, 200*mm, 48*mm) c.circle(105*mm, 200*mm, 60*mm) c.showPage() c.save()

Esto produce seis páginas con varios degradados más la llamada al método de gradiente y las líneas / círculos que muestran dónde están los puntos finales y las paradas:

¿Es posible crear un relleno de degradado en un PDF usando ReportLab (python)?


[Mi respuesta ya no es correcta, los degradados están ahora disponibles en Reportlab, vea la otra respuesta en esta página para más detalles.]

Lamento resucitar esta pregunta, pero me encontré con ella y no me respondieron correctamente.

La respuesta es no, a partir de hoy, la versión actual de ReportLab no admite gradientes. Los degradados son compatibles con PDF, sin embargo. Si observas en la clase Canvas de ReportLab, verás que muchos de sus métodos son envoltorios relativamente pequeños en torno a la generación del código PDF subyacente. Para acceder a los degradados en RL, deberá extender la clase Canvas y agregar métodos adicionales para generar el código PDF correcto. Esto es posible, pero obviamente no es trivial, y significa que tendrías que leer las especificaciones de PDF.

Hay dos alternativas. Primero genere el degradado como una imagen ráster y utilícelo, en segundo lugar, genere el degradado dibujando una serie completa de rectángulos en diferentes colores.

start_color = (1,0,0) end_color = (0,1,0) for i in range(100): p = i * 0.01 canvas.setFillColorRGB(*[start_color[i]*(1.0-p)+end_color[i]*p for i in range(3)]) canvas.rect(i, 0, 2, 100)

Por ejemplo. Desafortunadamente, obtener el gradiente sin problemas toma muchos rectángulos, y esto puede hacer que el PDF sea grande y se renderice lentamente. Estás mejor con el enfoque de trama.

Finalmente, podrías considerar usar PyCairo. Esto tiene mejor soporte para muchos elementos gráficos, y puede renderizarse en PDF o PNG. Sin embargo, carece de construcciones de palanca superior de Reportlabs (como el diseño de página).


¿Desea llenar un rectángulo (u otra ruta) con un degradado en lugar de un color sólido?

No hay problema. Use recorte para enlazar / limitar el degradado a una ruta. Solo recuerda establecer la ruta del clip antes de configurar el degradado. (Y envuélvalo dentro de saveState() / restoreState() para restablecer el clip y el degradado después).

c = canvas.Canvas (filename) #c.translate (8*cm, 8*cm) # use this to move the rectangle p = c.beginPath() p.rect (0,0 , 5*cm,5*cm) c.clipPath (p, stroke=0) c.linearGradient (0,0 , 5*cm, 5*cm , (red, yellow))

Para gradientes radiales, puede ser suficiente establecer el parámetro de extend palabra clave en False .