Se rendre au contenu

Mise en page et branding d'un rapport PDF dans Odoo 19

Série Rapports PDF · Article 4/5 — Développement Odoo
28 juin 2026 par
Mise en page et branding d'un rapport PDF dans Odoo 19
| Aucun commentaire pour l'instant

Série Rapports PDF · Article 4/5

Mise en page et branding d'un rapport PDF dans Odoo 19

Le contenu est juste : reste la forme. Orientation, marges, logo, couleurs de marque, en-tête et pied de page : on règle l'apparence d'un rapport sur trois leviers — le paperformat, l'agencement de document, et la mise en page external_layout.

~10 minutes de lecture · niveau avancé · parcours Web & UI

Ce que tu vas apprendre

Maîtriser le format papier

Orientation paysage, marges, et la relation margin_top / header_spacing qui évite le pire bug de mise en page : l'en-tête qui chevauche le corps.

Brander sans coder

L'agencement de document : choisir un style, poser un logo et des couleurs de marque qui s'appliquent à tous les rapports.

Personnaliser la mise en page

Donner un titre à l'en-tête avec layout_document_title, et retoucher la mise en page native par héritage xpath.

L'anatomie d'une page de rapport

Avant de régler quoi que ce soit, il faut voir la page comme Odoo la voit : quatre marges délimitent une zone utile, dans laquelle un en-tête (logo, adresse), un corps et un pied de page (mentions, pagination) prennent place. Le paperformat fixe les marges ; l'agencement de document remplit l'en-tête et le pied ; le template écrit le corps.

EN-TÊTE — logo, adresse, couleurs CORPS — le template (page) PIED — mentions, Page X / Y margin_top margin_bottom margin_left margin_right

1 — Le format papier, en détail

Le report.paperformat ne sert pas qu'à choisir A4. Il pilote l'orientation, les quatre marges en millimètres, le filet d'en-tête, la résolution. Pour un récapitulatif large, on bascule en paysage et on affiche un filet sous l'en-tête :

<record id="paperformat_catalog_landscape" model="report.paperformat">
    <field name="name">Récapitulatif A4 paysage</field>
    <field name="format">A4</field>
    <field name="orientation">Landscape</field>
    <field name="margin_top">40</field>
    <field name="margin_bottom">20</field>
    <field name="margin_left">8</field>
    <field name="margin_right">8</field>
    <field name="header_spacing">35</field>
    <field name="header_line" eval="True"/>
    <field name="dpi">90</field>
</record>

On installe le module démo comme n'importe quel autre, puis on imprime depuis une commande :

odoo-bin -i odooskills_report_layout_demo -d ta_base

On rattache ensuite ce format à l'action via paperformat_id. Deux champs sont sources d'ennuis. margin_top réserve la hauteur de l'en-tête ; header_spacing écarte le corps de l'en-tête. Si header_spacing est trop petit, le corps remonte et chevauche l'en-tête — titre par-dessus l'adresse, filet en travers du texte. La règle : l'en-tête standard (logo + adresse) mesure environ 35 mm, donc margin_top ≈ 40 et header_spacing ≈ 35 laissent le corps démarrer proprement en dessous.

2 — L'agencement de document : brander sans coder

D'où viennent le logo et les couleurs d'un rapport ? Pas du template. Ils sont portés par la société, via l'agencement de document — l'assistant Paramètres → Sociétés → Configurer l'agencement. On y choisit un des sept styles natifs (Light, Boxed, Bold, Striped, Bubble, Wave, Folder), un logo, deux couleurs de marque, une police, un slogan et un pied de page.

Assistant Configurer l'agencement du document dans Odoo 19 : choix du style, logo, couleurs de marque, police et pied de page, avec aperçu live à droite
L'agencement de document : style, logo, couleurs et pied de page — appliqués à tous les rapports, sans une ligne de code.

Techniquement, ce choix se stocke dans company.external_report_layout_id. Quand un template appelle web.external_layout, un répartiteur lit ce champ et délègue au bon style ; à défaut, il retombe sur external_layout_standard — les sept gabarits sont décrits dans la référence officielle des rapports Odoo 19. C'est pourquoi un rapport bien construit autour du squelette html_containerexternal_layout hérite gratuitement de l'en-tête, du logo, des couleurs et du pied paginé :

<template id="report_branded_catalog">
    <t t-call="web.html_container">
        <t t-foreach="docs" t-as="doc">
            <t t-call="web.external_layout">
                <div class="page">
                    <!-- ton contenu -->
                </div>
            </t>
        </t>
    </t>
</template>

3 — Un titre dans l'en-tête

Les mises en page natives réservent un emplacement de titre, juste sous l'en-tête. On le remplit en posant la variable layout_document_title à l'intérieur du external_layout — exactement comme le font les rapports de facture ou de commande :

<t t-call="web.external_layout">
    <t t-set="layout_document_title">Récapitulatif <span t-field="doc.name"/></t>
    <div class="page">
        <!-- ... -->
    </div>
</t>

Le titre s'affiche alors dans la typographie et la couleur du style choisi, sans qu'on ait à le styler nous-mêmes. C'est le bon réflexe : laisser l'agencement gérer la forme, n'écrire que le fond.

4 — Retoucher la mise en page native

Pour aller au-delà des réglages d'agencement, on hérite directement de la mise en page par xpath — la même technique que pour personnaliser un rapport existant, appliquée cette fois au gabarit web.external_layout_standard. Ici, un filet d'accent aux couleurs de la marque, glissé juste avant le titre :

<template id="external_layout_standard_accent"
          inherit_id="web.external_layout_standard">
    <xpath expr="//h2[@t-out='layout_document_title']" position="before">
        <div style="height:3px;background:#d6336c;margin-bottom:8px;"/>
    </xpath>
</template>

Deux précautions. D'abord, l'ancrage : la <div class="article"> du gabarit utilise t-attf-class (classe dynamique), donc un hasclass('article') ne la trouve pas — on vise plutôt le <h2> du titre, dont l'attribut est stable. Ensuite, la portée : cet héritage modifie la mise en page Standard pour tous les rapports qui l'utilisent, pas seulement le nôtre. À réserver à un branding maison assumé, ou à scoper sur un style dédié.

Mis bout à bout — paysage, agencement, titre, filet d'accent — voici le rendu final, en-tête de société, filet de marque, titre et pied paginé compris :

Rapport PDF Odoo 19 en orientation paysage avec logo société, filet d'accent crimson sous l'en-tête, titre Récapitulatif, tableau d'articles et pied de page paginé
Le rapport en paysage : logo et adresse de l'agencement, filet d'accent par héritage, titre layout_document_title, pagination Page 1 / 1.

⚠️ Trois pièges de mise en page

  • L'orientation ne se voit que dans le vrai PDF. L'aperçu /report/html rend toujours en portrait à la largeur du navigateur ; seul le rendu /report/pdf (wkhtmltopdf) applique le paysage. Toujours vérifier sur le PDF téléchargé.
  • header_spacing trop petit = chevauchement. Le corps remonte dans l'en-tête. On augmente header_spacing (et margin_top) jusqu'à ce que le corps démarre sous l'adresse.
  • Pas de bundle d'assets dans le PDF. En v19, web.report_assets_common est un bundle de manifeste, pas un template héritable. Pour styler le PDF, on écrit des styles inline sur les éléments.

À retenir

📐 Le paperformat cadre la page

Orientation, marges, filet, DPI ; surveille la paire margin_top / header_spacing.

🎨 L'agencement brande sans code

Logo, couleurs et pied de page viennent de external_report_layout_id, partagés par tous les rapports.

🏷️ layout_document_title

Un titre dans l'en-tête, stylé automatiquement par la mise en page.

✂️ xpath pour la mise en page

Hériter d'external_layout_standard retouche le gabarit — globalement, donc avec prudence.

Télécharge le Guide Technique Odoo

Un module Odoo 19 fonctionnel, 20+ articles techniques, environnements de dev et pipeline complet — le tout en PDF.

Télécharger le guide

À lire également

↔ Le pendant fonctionnel

Régler logo, couleurs et format d'impression depuis l'interface, sans développer : le blog fonctionnel détaille les modèles de rapports et le format d'impression dans Odoo 19 Community.

Se connecter pour laisser un commentaire.
Gérer les sorties d'impression dans Odoo 19
Série Rapports PDF · Article 3/5 — Développement Odoo