Project

General

Profile

Actions

Feature #377

closed
RA

Feature #82: Améliorer la génération de PDF pour les contrats avec design professionnel et signatures configurables

Refonte du rendu PDF contrat : HTML → Chromium (Playwright) + Paged.js (mise en page A4 pro multi-page)

Feature #377: Refonte du rendu PDF contrat : HTML → Chromium (Playwright) + Paged.js (mise en page A4 pro multi-page)

Added by Redmine Admin about 2 months ago. Updated about 1 month ago.

Status:
Shipped
Priority:
Normal
Assignee:
-
Start date:
06/15/2026
Due date:
% Done:

0%

Estimated time:
spec_ref:
build_status:
build_number:
ci_run_url:
scan_status:
scan_report_url:
deploy_status:
deployed
preprod_url:
deployed_at:
06/23/2026
branch:
feat/377-contract-pdf-chromium
pr_url:
security_key:
severity:
paused:

Description

**Suivi #82/#90.** Le moteur pdf-lib hand-rolled (#90) produit une mise en page cassée sur les contrats multi-pages : texte qui se chevauche/duplique aux sauts de page, signatures/logo par-dessus le texte, formatage HTML perdu (gras/listes/tableaux). pdf-lib n'a pas de moteur de flux/pagination.

**Solution retenue (B) :** rendre le contrat HTML via **Chromium headless (Playwright) + Paged.js**, embarqué dans l'image api.

### Architecture (hexagonale)
- `domain/ports/pdf-renderer.port.ts` : `PdfRendererPort.renderHtmlToPdf(html, opts): Promise<Buffer>`.
- `infrastructure/pdf/chromium-pdf.renderer.ts` : adaptateur Playwright (navigateur singleton, `--no-sandbox`), `setContent` + injection Paged.js + `page.pdf({format:'A4', printBackground:true})`. Échec → `DependencyUnavailableError(503)`.
- `application/functions/contract-html.builder.ts` : fonction **pure** qui assemble le document HTML complet + le CSS d'impression (testable sans navigateur).
- `contract-pdf.use-cases.ts` : recâblé (résout réglages/logo/signatures comme #91/#92 → builder → PdfRendererPort → stockage). **Contrat public `generateContractPdf` inchangé** (file_url + data-URI).
- `app.module.ts` : bind `PDF_RENDERER → ChromiumPdfRenderer`.
- `server/Dockerfile` : installer Chromium Playwright + libs système.

### Mise en page (Paged.js + print CSS)
- `@page { size:A4; margin:2cm }` ; éléments courants Paged.js : logo en en-tête sur **chaque** page, pied de page « page X / Y » + numéro de contrat.
- Corps = HTML **préservé** (gras/listes/tableaux) ; flux + sauts de page **automatiques** (plus de chevauchement).
- Bloc signatures = ligne HTML (emplacement left/right/side_by_side selon réglages), image signature + nom + « Signé par … le … », `break-inside: avoid` (jamais coupé, jamais par-dessus le texte). Les signatures sont dans le HTML → le **PDF signé** est corrigé de la même façon (plus de stamping pdf-lib).

## Acceptance criteria
- [ ] Contrat multi-pages : aucun chevauchement/duplication aux sauts de page.
- [ ] Logo en-tête + filet sur chaque page ; marges 2 cm ; numéro de contrat + pagination en pied.
- [ ] Formatage HTML (gras/listes/tableaux) préservé.
- [ ] Signatures (émetteur/destinataire) aux 3 emplacements, mentions, jamais par-dessus le texte ; PDF signé OK.
- [ ] `generateContractPdf` garde son contrat de retour ; flux de signature/contre-signature OK.
- [ ] Tests : builder HTML (unit, sans navigateur) + un rendu e2e (Chromium) ; lint/typecheck/build verts ; Dockerfile installe Chromium.
- [ ] Doc de conception : docs/superpowers/specs/2026-06-15-contract-pdf-chromium-design.md.

Actions

Also available in: PDF Atom