14 votes

comment regrouper des objets dans reportlab, afin qu'ils restent ensemble dans les nouvelles pages

Je suis en train de générer des fichiers pdf en utilisant reportlab. J'ai une certaine section qui est répétée. Elle contient un en-tête et un tableau :

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

Comment puis-je regrouper le paragraphe avec le tableau (en latex, je les mettrais dans le même environnement) pour qu'en cas de frein de page, le paragraphe et le tableau restent ensemble ? Actuellement, le paragraphe flotte parfois à la fin d'une page et le tableau commence en haut de la page suivante.

13voto

Vous pouvez essayer de les rassembler dans un KeepTogether fluide, comme ça :

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

Toutefois, sachez que, la dernière fois que j'ai vérifié, la mise en œuvre n'était pas parfaite et qu'elle divisait encore trop fréquemment les éléments. Je sais qu'il fait un bon travail pour garder ensemble un seul élément fluide qui autrement serait divisé, comme si vous disiez :

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

alors ce paragraphe ne serait pas divisé, sauf s'il était impossible qu'il ne le soit pas.

Si KeepTogether ne fonctionne pas pour vous, je vous suggère de créer un fichier personnalisé Flowable avec votre paragraphe et votre tableau à l'intérieur, puis, pendant la mise en page, assurez-vous que votre fichier personnalisé Flowable ne se laisse pas diviser.

11voto

memyself Points 2190

Voici la solution que j'ai trouvée en parcourant le code source de Reportlab :

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

4voto

j_walker_dev Points 798

L'utilisation d'un ParagraphStyle pourrait en fait être meilleure, alors je me suis dit que j'allais l'ajouter à cette super vieille réponse.

J'ai trouvé cela dans leur changelog après avoir vu la réponse de @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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X