2010-04-27 9 views
1

Я автоматически создаю PDF-файл с Platypus с динамическим контентом.Dynamic Spacer в ReportLab

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

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

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

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

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

ответ

2

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

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() 

проверено и работает отлично.

+1

Я считаю, что f._aH фактически возвращает доступную высоту, поэтому вы можете пойти и поместить некоторые текущие элементы в фрейм, а затем просто получить f._aH, чтобы вернуть высоту, оставшуюся для разделителя. Кроме того, теперь нет необходимости в расположении, которое вы переключили на кадры. вы можете просто element.append (FrameBreak()) и перейти к следующему кадру, а оставшееся пространство в кадре будет пустым. –

0

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

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

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

нет, я просто хотел иметь документ с одной страницей, который не разбивается на страницы. – ptikobj

Смежные вопросы