Python reportLab утконос: нижнее изображение - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю с библиотекой reportlab и у меня есть сомнения по поводу добавления изображения с использованием SimpleDocTemplate.

У меня динамическое содержимое, и я не знаю, сколько места оно занимает.Что происходит, так это то, что я хочу добавить логотип внизу страницы (всегда в одном и том же месте).То, как я это делаю, - это добавить вещи в список: например, [текст, разделитель, таблица, разделитель, логотип], а затем создать его.Место логотипа зависит от других переменных.

Не могли бы вы помочь мне выполнить это поведение?

Я знаю, что это можно сделать с помощью абсолютного позиционирования (например, используя drawImage в классе canvas)но я не знаю, как совместить то, как я это делаю, с этим.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Скорее всего, вы хотите поместить изображение в нижний колонтитул (ближе к ответу axel_ande).Таким образом, изображение будет размещаться в одном и том же месте на каждой странице, но определяться только один раз.

Если вы хотите поместить изображение внизу страницы, но не в нижнем колонтитуле, вы можете попробовать TopPadder объект-оболочку:

from reportlab.platypus.doctemplate import SimpleDocTemplate
from reportlab.platypus.flowables import TopPadder
from reportlab.platypus import Table, Paragraph

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors

import numpy as np


document = SimpleDocTemplate('padding_test.pdf')

table = Table(np.random.rand(2,2).tolist(),
              style=[('GRID', (0, 0), (-1, -1), 0.5, colors.black)])
styles = getSampleStyleSheet()
paragraph = Paragraph('Some paragraphs', style=styles['Normal'])

document.build([
    paragraph,
    TopPadder(table),
])

# This should generate a single pdf page with text at the top and a table at the bottom.

Я наткнулся на это, просматривая код , единственная документация, которую я мог найти, была в заметки о выпуске .В моем примере я просто обертываю таблицу, чтобы пример кода был автономным.

Надеюсь, это поможет!

0 голосов
/ 21 сентября 2018

Я получил заголовок для отчетов, которые я генерирую, которые я создаю как этот код (где PageTemplate генерирует заголовок для каждой статьи.

from reportlab.platypus import Table, TableStyle, Paragraph
from reportlab.platypus.frames import Frame
from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate

class MyDocTemplate(BaseDocTemplate):
    def __init__(self, filename, tr, param1, param2, plugin_dir, **kw):
        self.allowSplitting = 0
        BaseDocTemplate.__init__(self, filename, **kw)
        self.tr = tr
        self.plugin_dir = plugin_dir
        frame = Frame(self.leftMargin, self.bottomMargin, self.width, self.height - 2 * cm, id='normal')
        template = PageTemplate(id='test', frames=frame, onPage=partial(self.header, param1=param1, param2=param2))
        self.addPageTemplates(template)

    def header(self, canvas, doc, param1, param2):
        canvas.saveState()
        canvas.drawString(30, 750, self.tr('Simple report from GeoDataFarm'))
        canvas.drawString(30, 733, self.tr('For the growing season of ') + str(param1))
        canvas.drawImage(self.plugin_dir + '\\img\\icon.png', 500, 765, width=50, height=50)
        canvas.drawString(500, 750, 'Generated:')
        canvas.drawString(500, 733, param2)
        canvas.line(30, 723, 580, 723)
        #w, h = content.wrap(doc.width, doc.topMargin)
        #content.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin - h)
        canvas.restoreState()

doc = MyDocTemplate(report_name, self.tr, self.plugin_dir, '2018', '2018-09-21')
story = []
data_tbl = [['col1', 'col2'],[1, 2],[3, 4]]
table = Table(data_tbl, repeatRows=1, hAlign='LEFT', colWidths=[380/l_heading] * l_heading)
table.setStyle(TableStyle([('FONTSIZE', (0, 0), (l_heading, 0), 16)]))
story.append(table)
doc.build(story)
...