Я создаю 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 правильно разбивает длинный абзац, если конец абзаца не «совпадает» с концом страницы (текстовой областью).
Как мне с этим справиться?