# Bibliothèque `pdflab` — générer des PDF par le code

Source : https://docs.berkios.online/modules/pdflab/ · Section : Modules · Documentation officielle BERKIOS (https://docs.berkios.online)


Clone de **ReportLab** (Python) en JavaScript pur, sans dépendance. Le moteur est dans `pdflab/` ; la bibliothèque BERKIOS `pdflab.bkl` (44 commandes, fr/en) l'expose aux composants via la commande native `pdf <action> …`.

## Cycle d'un document
1. `pdf-nouveau` (réinitialise) — 2. réglages (`pdf-format`, `pdf-orientation`, `pdf-marges`, `pdf-auteur`, `pdf-entete`, `pdf-pied`, `pdf-numerotation`, `pdf-filigrane`, `pdf-proteger`, `pdf-police`, `pdf-couleur`, `pdf-nom`, `pdf-proteger`) — 3. contenu (`pdf-titre`, `pdf-sous-titre`, `pdf-section`, `pdf-texte`, `pdf-note`, `pdf-bloc-citation`, `pdf-puces`, `pdf-numerotee`, `pdf-tableau`, `pdf-total`, `pdf-fiche`, `pdf-image`, `pdf-graphique`, `pdf-code-barres`, `pdf-qr`, `pdf-champ`, `pdf-case`, `pdf-liste`, `pdf-code`, `pdf-espace`, `pdf-ligne`, `pdf-saut-page`, `pdf-sommaire`) — 4. sortie (`pdf-generer`, `pdf-pages`, `pdf-apercu`, `pdf-imprimer`, `pdf-telecharger`, `pdf-ouvrir`).

Le texte accepte le mini-balisage de ReportLab : `<b>`, `<i>`, `<u>`, `<font color="#c00">`, `<a href="…">`, `<br/>`, entités HTML. Un tableau se saisit `A;B|1;2|3;4` (lignes séparées par `|`, colonnes par `;`). Les pieds et en-têtes acceptent `{page}`, `{pages}`, `{date}`, `{titre}`.

## Exemple
```
pdf-nouveau
pdf-titre "Facture 2026-014"
pdf-tableau "Désignation;Qté;Prix|Clavier;2;40|Souris;1;15"
pdf-total "Total;;95"
pdf-numerotation "Page {page} / {pages}"
pdf-apercu
```
L'aperçu s'ouvre dans une fenêtre avec **Imprimer** et **Télécharger**.

## API JavaScript (navigateur ou Node)
```js
import { SimpleDocTemplate, Paragraph, Table, getSampleStyleSheet, cm } from "pdflab/dist/pdflab.mjs";
const ss = getSampleStyleSheet();
const bytes = new SimpleDocTemplate("a.pdf").build([new Paragraph("Bonjour", ss.Title), new Table([["A","B"],["1","2"]])]);
```
Navigateur : `<script src="pdflab.js">` expose `window.pdfLab` (`downloadPdf`, `printPdf`, `openPdf`). Spécification JSON : `pdfLab.buildDocument({title, pageSize, content:[…]})`.

## Sécurité, QR code et formulaires
- `pdf-qr "https://exemple.org" 30 M` : QR code vectoriel (octets UTF-8, versions 1 à 10, niveaux L/M/Q/H ; jusqu'à 271 octets).
- `pdf-proteger "ouvrir123" "admin456" "copie,modification"` : chiffrement AES-128 (gestionnaire standard V4/R4) ; mot de passe d'ouverture (vide = ouverture libre), mot de passe propriétaire, droits interdits (copie, modification, impression, annotation).
- `pdf-champ`, `pdf-case`, `pdf-liste` : champs de formulaire remplissables (texte, case à cocher, liste déroulante), avec apparence statique incluse. API : `canvas.textField / checkBox / comboBox`, `FormField` dans un récit.
- Polices `.otf` (CFF) : `registerTTFont("Nom", octets)` les accepte ; elles sont incorporées en entier (pas de sous-ensemble). PNG entrelacés (Adam7) pris en charge.

## Runtimes
| Cible | Prise en charge |
|---|---|
| Studio | commande native `pdf` + fenêtre d'aperçu (Imprimer / Télécharger) |
| Moteur du protocole (BRP) | le moteur construit le PDF et appelle les services client `pdf.apercu`, `pdf.telecharger`, `pdf.imprimer` (base64) |
| Client Flutter générique | services `pdf.*` via le paquet `printing` (aperçu, impression, partage) — code Dart **non compilé** ici (pas de SDK) |
| Applications Flutter exportées (interpréteur Dart natif) | **non raccordées** : moteur JavaScript uniquement |

## Permissions et limites
Permissions inférées : `impression` (commande `pdf`), `fichiers` (téléchargement). Non gérés : signatures numériques, chiffrement AES-256 (R6), polices à variantes, boutons radio. L'aperçu en iframe n'est pas pris en charge par certains navigateurs mobiles (utiliser Télécharger).

Régénération : `node scripts/build-bibliotheque-pdflab.mjs` ; exemple : `node scripts/build-pdflab-example.mjs` ; bundle : `node pdflab/tools/build-bundle.mjs` puis recopier `pdflab/dist/pdflab.js` dans `examples/application/pdf/`.
