ReportLab: слишком большой объем на странице 1 во фрейме 'normal' шаблона 'First' - PullRequest
5 голосов
/ 09 октября 2011

Я строю PDF, используя ReportLab. Моя программа имеет класс MyDocTemplate(SimpleDocTemplate) с двумя методами: beforePage(self) и afterPage(self), которые добавляют верхний и нижний колонтитулы (как изображение PNG) на каждую страницу. Существует также класс MyDocStyle, который описывает ParagraphStyle.

Основной метод выглядит так:

TITLE = Paragraph(Title, MyDocStyle.h1)
TO = Paragraph(To, MyDocStyle.h2)
FROM = Paragraph(From, MyDocStyle.h2)
SUBJECT = Paragraph(Subject, MyDocStyle.h2)
LONG_PARAGRAPH = Paragraph(Text, MyDocStyle.h3)
...

Elements = [TITLE, TO, FROM, SUBJECT, LONG_PARAGRAPH, ...]
doc = MyDocTemplete('output.pdf', pagesize=A4, 
                     leftMargin=2*cm, rightMargin=2*cm,
                     topMargin=4*cm, bottomMargin=4*cm)
doc.build(Elements)

Данные поступают из CSV-файлов и графического интерфейса. Время от времени (зависит от длины данных) я получаю сообщение об ошибке:

Flowable <Spacer at 0x2631120 frame=normal>...(1 x 5.66929133858) too large
on page 1 in frame 'normal'(469.88976378 x 603.118110236) of template 'First'

Это исключение останавливает мою программу. Для коротких абзацев я установил MyDocStyle class h2.keepWithNext = 1, но это не идеальное решение. ReportLab правильно разделяет длинный абзац, если конец абзаца не «совпадает» с концом страницы (текстовая область).

Как с этим справиться?

Ответы [ 2 ]

5 голосов
/ 13 марта 2015

Эта ошибка возникает, когда ReportLab пытается разделить разделитель на две страницы. Кажется, что единственный способ обойти эту проблему - обернуть ваш Spacer в элемент KeepTogether:

elements.append(KeepTogether(Spacer(width, height)))
0 голосов
/ 12 октября 2011

Решено. Не используйте Spacer (например, Spacer(1, 0.2*cm)) в качестве разделителя для Paragraph.Вместо этого определите spaceBefore и spaceAfter в ParagraphStyle, например:

ParagraphStyle(name = 'Normal',
               fontName = "Verdana",
               fontSize = 11,
               leading = 15,
               alignment = TA_JUSTIFY,
               allowOrphans = 0,
               spaceBefore = 20,
               spaceAfter = 20,
               wordWrap = 1)
...