¿Cuál es la mejor manera de tener un pie de página y un encabezado en el informe, que no solo una línea, que se puede dibujar con canvas.drawString en la función onPage. No encontré la manera de poner algo como Párrafo en el encabezado/pie de página en la función onPage. ¿Cuál es la mejor manera de manejar esto? ¿Hay alguna manera de poner un párrafo en el pie de página?Un pie de página y encabezado de varias líneas en el informe
Respuesta
Puede utilizar comandos de dibujo arbitrarios en la función onPage, por lo que puede dibujar un párrafo (consulte la sección 5.3 en el reportlab user guide) desde su función.
Aquí es un ejemplo completo:
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph
styles = getSampleStyleSheet()
styleN = styles['Normal']
styleH = styles['Heading1']
def footer(canvas, doc):
canvas.saveState()
P = Paragraph("This is a multi-line footer. It goes on every page. " * 5,
styleN)
w, h = P.wrap(doc.width, doc.bottomMargin)
P.drawOn(canvas, doc.leftMargin, h)
canvas.restoreState()
doc = BaseDocTemplate('test.pdf', pagesize=letter)
frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height,
id='normal')
template = PageTemplate(id='test', frames=frame, onPage=footer)
doc.addPageTemplates([template])
text = []
for i in range(111):
text.append(Paragraph("This is line %d." % i,
styleN))
doc.build(text)
respuesta de Jochen es grande, pero me pareció incompleta. Funciona para los pies de página, pero no para los encabezados, ya que Reportlab dibujará todos los flowables en la parte superior del encabezado. Debe asegurarse de que el tamaño del Marco que crea excluye el espacio ocupado por el encabezado, por lo que los flowabls no se imprimen en la parte superior del encabezado.
Mediante el código de Jochen, aquí es un ejemplo completo para los encabezados:
from reportlab.lib.pagesizes import letter, cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph
from functools import partial
styles = getSampleStyleSheet()
styleN = styles['Normal']
styleH = styles['Heading1']
def header(canvas, doc, content):
canvas.saveState()
w, h = content.wrap(doc.width, doc.topMargin)
content.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin - h)
canvas.restoreState()
doc = BaseDocTemplate('test.pdf', pagesize=letter)
frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height-2*cm, id='normal')
header_content = Paragraph("This is a multi-line header. It goes on every page. " * 8, styleN)
template = PageTemplate(id='test', frames=frame, onPage=partial(header, content=header_content))
doc.addPageTemplates([template])
text = []
for i in range(111):
text.append(Paragraph("This is line %d." % i, styleN))
doc.build(text)
Tenga en cuenta el decleration del marco, se resta 2 cm de la altura del marco para permitir espacio para la cabecera. Los flowables se imprimirán dentro del marco para que pueda cambiar el tamaño del marco para permitir varios tamaños de encabezados.
También encuentro que generalmente necesito pasar variables al encabezado, así que utilicé una función parcial asignada a onPage para que se pueda pasar el contenido del encabezado. De esta manera puede tener un encabezado variable basado en el contenido de la página.
Sé que esto es un poco viejo, pero me he encontrado con este problema y pude resolverlo. Cuando tiene más de una página en su PDF y desea tener el pie de página/encabezado en cada página, debe usar NextPageTemplate('template_id')
. Solo estoy escribiendo el código relevante ya que el resto se muestra en el ejemplo de @jochen anterior.
En mi caso, estaba usando PageBreak()
y me tomó un tiempo entender por qué solo estaba obteniendo el pie de página en la primera página.
from reportlab.platypus import Paragraph, PageBreak, PageTemplate, Frame, NextPageTemplate
frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')
template = PageTemplate(id='footer', onPage=footer, frames=[frame])
# add a NextPageTemplate before a PageBreak to have the footer in the next page
text.append(Paragraph('some text', style)),
text.append(NextPageTemplate('footer')), # this will make the footer to be on the next page if exists
text.append(PageBreak())
doc.build(text)
- 1. encabezado y pie de página y freemarker
- 2. Encabezado y pie de página XSL FO
- 3. listview con encabezado y pie de página
- 4. Crear un encabezado/pie de página PHP
- 5. Encabezado y pie de página personalizados en la página html
- 6. Animar un encabezado y pie de página de UITableView
- 7. encabezado y pie de página en gambas PDF
- 8. Capacidades de impresión de encabezado HTML y pie de página
- 9. Cambiando o eliminando encabezado y pie de página en TCPDF
- 10. UITableView encabezado/pie de página color
- 11. Encabezado, pie de página y tablas grandes con iTextSharp
- 12. android listviews: vistas de encabezado y pie de página
- 13. Contenido con 100% entre encabezado y pie de página
- 14. ¿Hay alguna manera de obtener un encabezado/pie de página web impreso en cada página?
- 15. scrollVer y pie de página en Android
- 16. ¿Cómo eliminar el espacio del encabezado y el pie de página desde un UITableView?
- 17. TCPDF - Tener pie de página/encabezado en determinadas páginas solo
- 18. Agregando encabezado y pie de página con número de página en dompdf
- 19. Cómo configurar el encabezado y el pie de página para el diseño lineal en Android
- 20. ¿Cómo incluyo el encabezado y el pie de página con el diseño en Zend Framework?
- 21. Encabezado y pie de página fijo en la versión móvil de un sitio web
- 22. RDLC informe el pie de página con el valor de "Registro actual"
- 23. cómo mantener fijo el encabezado y el pie de página de jquery mobile?
- 24. platillo volante encabezado piel y pie de página en la primera página
- 25. UICollectionView: cómo agregar espacio entre el pie de página y el encabezado?
- 26. Jquery mobile: deshabilita el encabezado y el pie de página fijo "tocar para alternar"
- 27. Informe de Crystal: mantener el encabezado de grupo y los detalles en la misma página
- 28. Eliminar el encabezado y el pie de página predeterminados del navegador al imprimir HTML
- 29. ¿Cómo pegar un pie de página al pie en css?
- 30. Cómo crear div para llenar todo el espacio entre div de encabezado y pie de página