Как группировать объекты в reportlab, чтобы они оставались вместе на новых страницах

Я создаю несколько файлов PDF с помощью reportlab. У меня есть определенный раздел, который повторяется. Он содержит заголовок и таблицу:

            Story.append(Paragraph(header_string, styleH))
            Story.append(table) 

Как я могу сгруппировать абзац с таблицей (в латекс я бы поставил их в одну и ту же среду), чтобы в случае блокировки страницы абзац и таблица остались вместе? В настоящее время абзац иногда плавает в конце одной страницы, и таблица начинается поверх следующей страницы.

Ответ 1

это решение, которое я обнаружил через исходный код reportlab:

paragraph = Paragraph(header_string, styleH)
paragraph.keepWithNext = True
Story.append(paragraph)
Story.append(table)

Ответ 2

Вы можете попытаться объединить их в KeepTogether текущие, например:

Story.append(KeepTogether([Paragraph(header_string, styleH), table])

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

Story.append(KeepTogether(Paragraph(header_string, styleH))

тогда этот параграф не будет разделен, если это невозможно для него.

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

Ответ 3

Использование ParagraphStyle на самом деле может быть лучше, поэтому я решил добавить его в этот супер старый ответ.

Обнаружил это в их списке изменений, увидев ответ @memyself.

  * 'KeepWithNext' improved:
    Paragraph styles have long had an attribute keepWithNext, but this was 
    buggy when set to True. We believe this is fixed now. keepWithNext is important 
    for widows and orphans control; you typically set it to True on headings, to 
    ensure at least one paragraph appears after the heading and that you don't get 
    headings alone at the bottom of a column. 
header = ParagraphStyle(name='Heading1', parent=normal, fontSize=14, leading=19,
                        spaceAfter=6, keepWithNext=1)