¿Es posible crear un relleno de degradado en un PDF usando ReportLab (python)?Creación de un relleno de degradado en un archivo PDF mediante el informe
Respuesta
[Mi respuesta ya no es correcta, gradientes están ahora disponibles en ReportLab, ver la otra respuesta en esta página para obtener más detalles.]
sentimos a resucitar esta pregunta, pero me encontré con él y hadn ha sido respondida 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, puede considerar el uso de 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).
ReportLab ahora es compatible con degradados de PDF.
Un parche para soporte de gradiente fue posted to the ReportLab mailing list por Peter Johnson el 6 de agosto de 2012 y fue added to the source al día siguiente. No puedo encontrar nada en the release notes for ReportLab 2.6, pero dado que fue lanzado el 1 de octubre de 2012, presumiblemente está allí. Está definitivamente presente en 2.7.
Se pueden especificar tanto gradientes lineales como radiales con paradas múltiples. La búsqueda en la documentación del término gradiente no muestra nada. Sin embargo, el message with the first version of the patch tiene un par de ejemplos que son la base de some tests in the ReportLab source. En base a esta He trabajado hasta un script de demostración rápida:
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 da salida a seis páginas con diferentes gradientes más el llamado método del gradiente y líneas/círculos que muestran en los puntos finales y las paradas son:
que desea rellenar un rectángulo (o r otra ruta) con un gradiente en lugar de ¿un color sólido?
No hay problema. Use recorte para enlazar/limitar el degradado a una ruta. Simplemente recuerde configurar la ruta del clip antes de configurando 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 que podría ser suficiente para establecer el parámetro extend
palabra clave para False
.
- 1. Creación de un PDF a partir de un Informe RDLC en segundo plano
- 2. Crear un relleno de degradado para texto usando [UIColor colorWithPatternImage:]
- 3. Servicios de informes: Obtenga el PDF de un informe generado
- 4. Creación de un informe FxCop legible
- 5. Relleno de degradado usando gráficos en Mathematica
- 6. de relleno degradado en el gráfico de líneas (Highcharts)
- 7. Generar un informe en PDF a partir de un archivo Excel generado (Biblioteca EPPLUS)
- 8. HTML a PDF vs. Creación de PDF mediante programación mediante PHP
- 9. Cómo crear campos PDF editables en un informe de Jasper
- 10. iOS SDK - Genere mediante programación un archivo PDF
- 11. establecer mediante programación margen/relleno de TextView en un listview
- 12. ¿Cómo incorporaría un SWF mediante programación en un PDF?
- 13. relleno de degradado de tres colores en r
- 14. Impresión de aplicaciones VB6 Crystal Informe a Adobe Distiller PDF: cómo configurar un nombre de archivo PDF?
- 15. Estructura de un archivo PDF?
- 16. Reconocer mediante programación el texto de los escaneos en un archivo PDF
- 17. Generar informe en PDF de php
- 18. Aplicar un degradado a CAShapeLayer
- 19. ¿Es posible mostrar un PDF en un informe de generador de informes?
- 20. Cómo puedo generar un archivo de informe (ODF, PDF) desde una vista de django
- 21. Informe de SSRS cabido en PDF
- 22. número de páginas en un archivo pdf
- 23. Creación de un PDF y envío por correo electrónico
- 24. Cómo buscar mediante programación un documento PDF en C#
- 25. ¿Cómo limitar el informe de RDLC para una página en un PDF?
- 26. Creación de CSS de un archivo HTML
- 27. Mostrar el informe .RDLC incrustado en un archivo DLL
- 28. Cómo agregar relleno al degradado <shape> en Android?
- 29. Determine el número de páginas en un archivo PDF
- 30. Determinar el número de páginas en un archivo PDF
Si bien hay información útil aquí, debe abordar la pregunta real, no una pregunta formulada en otra respuesta. –
@ ZAD-Man Bueno, a menos que desee llenar toda la página con un degradado lineal, debe usar el trazado de recorte (AFAIK). Estoy bastante seguro de que la mayoría de los casos de uso implica llenar regiones de la página. No soy partidario de interpretar pedante lo que dice/escribe la gente. Normalmente respondo a lo que, creo, el póster intenta hacer/hacer/descubrir. Y cuando lo haga; Comienzo mi respuesta diciendo cómo interpreté la pregunta. –
Bueno, a lo que me refiero es al hecho de que su respuesta está respondiendo a una "respuesta" ahora eliminada que debería haber sido una pregunta nueva. Su cita al principio está tomada de esa respuesta eliminada. Como dije, hay buena información aquí, pero debe ser editada para eliminar las referencias a la otra "respuesta", para reducir la posible confusión, especialmente ahora que la otra ha sido eliminada. –