Что является лучшим способом иметь нижний колонтитул и заголовок в reportlab, это не только одна строка, которую можно рисовать с помощью canvas.drawString в функции onPage. Не нашел способ вставить что-то вроде Paragraph в верхний/нижний колонтитул в функцию onPage. Каков наилучший способ справиться с этим? Есть ли способ поставить абзац в нижний колонтитул?Многострочный (абзац) нижний колонтитул и заголовок в reportlab
ответ
Вы можете использовать произвольные команды рисования в функции onPage, поэтому вы можете просто нарисовать абзац (см. Раздел 5.3 в reportlab user guide) из вашей функции.
Вот полный пример:
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)
Ответ Jochen является большим, но я нашел, что это неполно. Он работает для нижних колонтитулов, но не для заголовков, поскольку Reportlab будет рисовать все текущие потоки поверх заголовка. Вы должны быть уверены, что размер создаваемого фрейма исключает пространство, занимаемое заголовком, поэтому потоки не печатаются поверх заголовка.
Использование кода Jochen, вот полный пример для заголовков:
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)
Обратите внимание на decleration части рамы, вычитают 2 см от высоты кадра, чтобы обеспечить место для заголовка. Ресурсы будут напечатаны внутри рамки, чтобы вы могли изменить размер рамки, чтобы можно было использовать различные размеры заголовков.
Я также обнаружил, что мне обычно нужно передавать переменные в заголовок, поэтому я использовал частичную функцию, назначенную для onPage, чтобы передать содержимое заголовка. Таким образом, вы можете иметь заголовок переменной на основе содержание страницы.
Я знаю, что это немного устарело, но я столкнулся с этой проблемой и смог ее решить. Когда у вас есть более одной страницы в вашем PDF-файле и вы хотите иметь нижний колонтитул/заголовок на каждой странице, вы должны использовать NextPageTemplate('template_id')
. Я пишу только соответствующий код, так как остальные показаны в приведенном выше примере @jochen.
В моем случае я использовал PageBreak()
, и мне потребовалось некоторое время, чтобы понять, почему я только получаю нижний колонтитул на первой странице.
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. Заголовок и нижний колонтитул Codeigniter:
- 2. Скрыть заголовок и нижний колонтитул
- 3. многострочный нижний колонтитул в Prawn PDF
- 4. плавающий стол заголовок И нижний колонтитул
- 5. Где хранится нижний колонтитул malloc() и заголовок?
- 6. DotNetNuke - заголовок, содержимое и нижний колонтитул
- 7. Пользовательский заголовок и нижний колонтитул TCPDF WriteHTML
- 8. Заголовок наверху всегда и нижний колонтитул внизу
- 9. Навигатор, нижний колонтитул и заголовок между переходами
- 10. HTML5: Липкий нижний колонтитул, заголовок и статья
- 11. липкий нижний колонтитул и фиксированный заголовок
- 12. ABCpdf скопировать заголовок и нижний колонтитул
- 13. java inputstream (добавить заголовок и нижний колонтитул)
- 14. Исправлен заголовок и нижний колонтитул для GridView
- 15. Нижний колонтитул страницы и нижний колонтитул страницы в отчете MS
- 16. Нижний колонтитул нижний колонтитул
- 17. Нижний нижний нижний колонтитул
- 18. Python Reportlab комментировать абзац
- 19. отдельный заголовок, нижний колонтитул в yii
- 20. Нижний колонтитул только на последней странице данных в Reportlab
- 21. Reportlab: Как добавить нижний колонтитул в pdf-файл
- 22. Заголовок интеграции, содержание, нижний колонтитул в html2pdf
- 23. Верхний и нижний колонтитул
- 24. Исправлен заголовок и нижний колонтитул в таблице и div?
- 25. PHP содержит заголовок или нижний колонтитул
- 26. Нижний нижний колонтитул с заголовком и бутстрапом
- 27. Заголовок набора узлов Phantomjs, нижний колонтитул
- 28. Может ли нижний колонтитул иметь заголовок?
- 29. Отобразить заголовок фрагмента как нижний колонтитул активности
- 30. Базовый заголовок - Центр - Нижний колонтитул Ваадин