Динамическая распорная деталь в ReportLab

Я автоматически генерирую файл PDF с Утконосом, который имеет динамический контент.

Это означает, что могло бы произойти, что длина текстового содержания (который является непосредственно у основания файла PDF) может варьироваться.

Однако это могло бы произойти, что разрыв страницы сделан в случаях, где содержание является слишком длинным. Это вызвано тем, что я использую "статическую" распорную деталь:

s = Spacer(width=0, height=23.5*cm) 

поскольку я всегда хочу иметь только одну страницу, я так или иначе должен динамично установить высоту Распорной детали, так, чтобы "отдых" пространства, которое оставляют на странице, был взят Распорной деталью как ее высота.

Теперь, как я получаю "отдых" высоты, которую оставляют на моей странице?

1
задан ptikobj 27 April 2010 в 15:13
поделиться

2 ответа

Я немного обнюхал библиотеку reportlab и обнаружил следующее: В принципе, я решил использовать фрейм, в котором текучие файлы будут быть напечатанным. f._aH возвращает высоту кадра (мы также можем вычислить ее вручную). Вычитая высоту двух других текучих материалов, которые мы получаем через обертку, мы получаем оставшуюся высоту, которая является высотой проставки.

elements.append(Flowable1)
elements.append(Flowable2)

c = Canvas(path)
f = Frame(fx, fy,fw,fh,showBoundary=0)

# compute the available height for the spacer
sheight = f._aH - (Flowable1.wrap(f._aW,f._aH)[1] + Flowable2.wrap(f._aW,f._aH)[1])

# create spacer
s = Spacer(width=0, height=sheight)

# insert the spacer between the two flowables
elements.insert(1,s)

# create a frame from the list of elements
f.addFromList(elements,c)

c.save()

протестировал и работает нормально.

2
ответ дан 3 September 2019 в 01:00
поделиться

Насколько я понимаю, вы хотите иметь нижний колонтитул, верно?

Тогда вы должны сделать это примерно так:

def _laterPages(canvas, doc):
    canvas.drawImage(os.path.join(settings.PROJECT_ROOT, 'templates/documents/pics/footer.png'), left_margin, bottom_margin - 0.5*cm, frame_width,  0.5*cm)

doc = BaseDocTemplate(filename,showBoundary=False)
doc.multiBuild(flowble elements, _firstPage, _laterPages)
0
ответ дан 3 September 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: