Python reportlab - Как нарисовать что-то на последней странице SimpleDocTemplate? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать счет с библиотекой python reportlab в представлении Django.

Но теперь мой вопрос:

Как я могу написать / нарисовать что-нибудь внизу (это важно!) Последней страницы? (Который также может быть первым, в зависимости от длины таблицы.)

Моя идея состояла в том, чтобы просто получить холст последней страницы и нарисовать на нем нижний колонтитул (я добавил Spacer, чтобы я Я могу быть уверен, что для этого достаточно места. Это сработает, но я не могу получить холст последней страницы.)

buffer = BytesIO()

doc = SimpleDocTemplate(buffer, rightMargin=10*mm, leftMargin=10*mm, topMargin=10*mm, bottomMargin=0*mm)
elements = [Spacer(1,75*mm),get_table(),Spacer(1,108*mm)]
# get_table() returns a Table object

doc.build(elements, onFirstPage=draw_header)
# draw_header draws the header on the canvas

draw_invoice(CANVAS) # here's my problem

buffer.seek(0)

return FileResponse(buffer, as_attachment=False, filename='invoice.pdf')

Есть ли способ получить холст последней страницы после построения сделать c и изменить его? Или есть другой способ решить мою проблему?

Вот скриншот того, что я пытаюсь сделать: (Таблица может также go на более чем 2 страницах, нижний колонтитул просто имеет находиться внизу самой ранней возможной страницы , но после таблицы.)

What I'm trying to get

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

У меня было несколько проблем с reportlab, да, это отличный инструмент для генерации pdf, но в большинстве случаев мне приходилось переопределять функции и создавать подкласс из basedoctemplate.

Что бы я сделал, это создал шаблон страницы которые включают эту информацию, а затем переходят к ней, прежде чем завершить sh документ с помощью Pagebreak ().

class MyDocTemplate(BaseDocTemplate):
def __init__(self, data, filename, **kw):
    self.data = data
    self.allowSplitting = 0
    BaseDocTemplate.__init__(self, filename, **kw)

    #Frame bottom, limited to your work area
    frame_bottom = Frame(self.leftMargin, self.bottomMargin, self.width/2, self.height/2 - 20*mm,
                    page_height_landscape - 2 * self.bottomMargin,
                    id='landscape', showBoundary=0)
    # Definicion de templates
    template_last_page = PageTemplate('last_page', frames=frame_b,
                                       onPage=lastpage)

После этого вы можете добавить страницу template_last_page к своей работе c. Затем, чтобы добраться до финала документа, используйте метод nextpagetemplate («ваш шаблон»), затем Pagebreak ().

Если вы не используете подклассы из библиотеки, иногда это очень ограничивает. Я купил книгу Reportlab, Reportlab: Обработка с Python, мне очень помогли с такими проблемами.

С уважением.

0 голосов
/ 02 мая 2020

Мне удалось найти собственное решение:

Я создал свой Flowable и добавил его с TopPadder к другому Flowables. Я должен был поставить Spacer между, потому что в противном случае мой Flowable иногда перекрывался с Table.

...