Многострочный (абзац) нижний колонтитул и заголовок в reportlab

Каков наилучший способ иметь нижний колонтитул и заголовок в reportlab, это не только одна строка, которую можно выделить с помощью canvas.drawString в функции onPage. Не нашел способ вставить что-то вроде Paragraph в верхний / нижний колонтитул в функцию onPage. Каков наилучший способ справиться с этим? Есть ли способ поставить абзац в нижний колонтитул?

3 Solutions collect form web for “Многострочный (абзац) нижний колонтитул и заголовок в reportlab”

Вы можете использовать произвольные команды рисования в функции onPage, поэтому вы можете просто нарисовать абзац (см. Раздел 5.3 в руководстве пользователя reportlab ) из вашей функции.

Вот полный пример:

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) 

Ответ Йохена велик, но я нашел его неполным. Он работает для нижних колонтитулов, но не для заголовков, поскольку 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) 

Обратите внимание на отклонение кадра, он вычитает 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) 
  • Использование Python ReportLab для splitfirst / splitlast
  • python reportlab - registerFont - django - шрифт недоступен через некоторое время
  • PyInstaller сгенерирован exe не работает, в проекте используется ReportLab
  • IOError: «декодер zip недоступен» с использованием matplotlib PNG в ReportLab для Linux, работает в Windows
  • Reportlab: заголовок с данными со страницы
  • Условный разрыв страницы в reportlab
  • Можем ли мы создавать интерактивные формы PDF с помощью reportlab?
  • 2 оси Reportlab Graph
  • Что определяет вертикальное пространство в таблицах Reportlab?
  • Django ReportLab: использование объекта Drawing для создания PDF и возврата через Httpresponse
  • Лучший способ экспорта Pandas DF в PDF-файл с использованием Python
  •  
    Interesting Posts for Van-Lav

    Измените цвет __init__ и других предопределенных элементов в подсветке синтаксиса Pycharm

    Что такое использование последней запятой в этом коде?

    Tkinter: Подождите, пока элемент в очереди

    Как я могу обрабатывать xml асинхронно в python?

    Перезагрузка модуля дает функциональность, которая изначально не доступна, импортируя ее. где я могу узнать больше об этом?

    Сделать специальную диагональную матрицу в Numpy

    Диапазон в виде словарного ключа в Python

    Доступ к данным POST в форме Django

    играть музыку, используя pygame, но без звука

    Как правильно отсортировать строку с номером внутри?

    Почему я получаю разные результаты при использовании понимания списка с сопрограммами с asyncio?

    Регулярные выражения Python для фильтрации списка строк

    Пространства имен в классе Python

    Очень непоследовательный результат распознавания текста для tesseract

    Как обеспечить синтаксическую окраску Python внутри Webstorm?

    Python - лучший язык программирования в мире.