Я автоматически генерирую файл PDF с Утконосом, который имеет динамический контент.
Это означает, что могло бы произойти, что длина текстового содержания (который является непосредственно у основания файла PDF) может варьироваться.
Однако это могло бы произойти, что разрыв страницы сделан в случаях, где содержание является слишком длинным. Это вызвано тем, что я использую "статическую" распорную деталь:
s = Spacer(width=0, height=23.5*cm)
поскольку я всегда хочу иметь только одну страницу, я так или иначе должен динамично установить высоту Распорной детали, так, чтобы "отдых" пространства, которое оставляют на странице, был взят Распорной деталью как ее высота.
Теперь, как я получаю "отдых" высоты, которую оставляют на моей странице?
Я немного обнюхал библиотеку 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()
протестировал и работает нормально.
Насколько я понимаю, вы хотите иметь нижний колонтитул, верно?
Тогда вы должны сделать это примерно так:
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)