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.
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.
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_container →
external_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 :
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/htmlrend 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_spacingtrop petit = chevauchement. Le corps remonte dans l'en-tête. On augmenteheader_spacing(etmargin_top) jusqu'à ce que le corps démarre sous l'adresse.- Pas de bundle d'assets dans le PDF. En v19,
web.report_assets_commonest 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📘 Pour aller plus loin : nos formations Odoo 19
À lire également
- Gérer les sorties d'impression — brancher, restreindre et imprimer en lot.
- Personnaliser un rapport existant (xpath) — la technique d'héritage, appliquée au contenu.
- Générer des rapports PDF avec QWeb — les fondamentaux du moteur de rendu.
↔ 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.