Moteur de mise en page open source · v1.33.5
Le compositeur programmable pour le web
Postext prend du Markdown sémantique et lui applique des règles éditoriales séculaires (justification Knuth-Plass, colonnes équilibrées, flottants qui savent où se placer) pour produire des pages de qualité éditoriale en HTML, canvas ou PDF prêt pour l’impression.
Chaque page est calculée dans votre navigateur
Postext
En bref
Postext est un logiciel libre et gratuit qui met en page des livres, des magazines et des rapports. Vous écrivez votre texte avec quelques marques simples, et Postext le transforme en pages finies, comme les pages d’un livre imprimé. Il suit des règles que les imprimeurs appliquent depuis des siècles, pour que le texte soit facile à lire. Les pages peuvent aller sur un site web, dans une application ou dans un PDF prêt à imprimer. Il est fait pour les auteurs, les éditeurs, les graphistes et les développeurs.
Transcription
Tout ce que dit le narrateur, avec une description de ce qui apparaît à l’écran.
- 0:00
À l’écranUne carte sombre affiche « MAINZ · 1455 » au-dessus d’un fin filet doré. Derrière le titre « For five centuries, print learned to set a page. » (« Pendant cinq siècles, l’imprimerie a appris à composer une page. »), l’année défile de 1455 à 2026 en immenses chiffres détourés, et des termes d’imprimerie, en anglais, se posent tout autour : justification, crénage (Kerning), veuves et orphelines, colonnes équilibrées, interlignage, grille de ligne de base, césure (écrite « hy·phen·a·tion »), longueur de ligne, flottants, titres courants, lézardes. La caméra plonge dans le point final, qui inonde l’écran d’or.
NarrationPendant cinq siècles, l’imprimerie a appris à composer une page.
- 0:05
À l’écranTitre : « The web learned to lay out interfaces. It never learned to set a page. » (« Le web a appris à mettre en page des interfaces. Il n’a jamais appris à composer une page. ») Une fenêtre de navigateur ouverte sur example.com/longform/article contient un article justifié sur trois colonnes, « Why the web can’t set a page » (« Pourquoi le web ne sait pas composer une page ») ; des étiquettes rouges signalent des lézardes de blanc, une veuve, une orpheline, une image qui tombe sur le texte et une dernière colonne déséquilibrée. À côté, une pastille de code affiche « column-count: 3; », puis « …and little else. » (« …et pas grand-chose de plus. ») et une liste barrée des cinq mêmes défauts. La fenêtre se brouille et s’effondre.
NarrationLe web a appris à mettre en page des interfaces. Jamais des pages. Alors le texte long se casse encore : lézardes, veuves, orphelines, collisions.
- 0:18
À l’écranAprès un éclair blanc et un balayage de bandes bleues, dorées et rouges, le logo et le nom de Postext se mettent en place avec le slogan « The programmable typesetter for the web » (« Le compositeur programmable pour le web »). En dessous : OPEN SOURCE · MIT LICENCE · v1.7.0 · RUNS IN YOUR BROWSER (open source, licence MIT, fonctionne dans votre navigateur).
NarrationVoici Postext : le compositeur programmable pour le web.
- 0:24
À l’écranSection 01 sur 07, « Content in » (« Le contenu entre ») : « Markdown says what things are. » (« Markdown dit ce que sont les choses. ») Un fichier Markdown, 03-why-postext.md, s’écrit tout seul : une directive de partie, le titre « Why Postext » avec un chapeau, un paragraphe qui renvoie à la figure fig-flow avec :ref, une ligne ::resource et un bloc :::callout. À côté, config.ts appelle buildDocument avec une mise en page sur deux colonnes, un texte courant justifié et la césure en en-us, sous la phrase « Configuration decides how they look. Nothing about layout lives in the text. » (« La configuration décide de leur apparence. Rien de la mise en page ne vit dans le texte. »)
NarrationVous écrivez du Markdown sémantique, qui dit ce que sont les choses. Une configuration décide de leur apparence.
- 0:32
À l’écranSection 02, « Pretext measures » (« Pretext mesure ») : « Measured without touching the DOM. » (« Mesuré sans toucher au DOM. ») Un titre, un paragraphe et un encadré sont scannés l’un après l’autre, et des lignes de cote donnent leur hauteur en points ; un panneau de code montre prepare(text, '25px Lora') et layout(prepared, width, 38), qui renvoient une hauteur et un nombre de lignes. Deux barres font la course sur 10 000 paragraphes : « Browser reflow · DOM » (la recomposition par le navigateur) bouge à peine, tandis que « Pretext · canvas metrics + arithmetic » (métriques canvas et arithmétique) se remplit d’un coup, et un compteur grimpe jusqu’à 600× au-dessus de « faster text measurement than the DOM, so a whole book reflows as you type » (« une mesure du texte plus rapide que le DOM : tout un livre se recompose pendant la frappe ») et de « Powered by @chenglou/pretext ».
NarrationChaque paragraphe est mesuré sans toucher au DOM, jusqu’à six cents fois plus vite, grâce à Pretext, la bibliothèque qui a rendu cela possible.
- 0:42
À l’écranSection 03, « Postext decides » (« Postext décide ») : « Every line placed before a pixel is drawn. » (« Chaque ligne placée avant qu’un seul pixel soit dessiné. ») Un anneau de sept segments s’allume tour à tour, Structure, Measure, Place, Float, Refine, Balance et Rhythm (structurer, mesurer, placer, faire flotter, affiner, équilibrer, rythmer), chacun avec une description d’une ligne, tandis qu’une page sur deux colonnes du guide de Postext s’assemble à côté : des blocs étiquetés volent jusqu’à leurs colonnes, une figure glisse à sa place sous la note « :ref{id="fig-flow"} → column foot » (pied de colonne), le bandeau d’ouverture descend, les lignes apparaissent, les colonnes s’égalisent et une grille de ligne de base balaie la page de haut en bas. L’anneau boucle sur les itérations 1 à 3 et affiche « Settled in 3 iterations » (« Stabilisé en 3 itérations ») avec une coche ; une bulle donne la boîte englobante et la ligne de base d’une ligne.
NarrationPuis Postext décide. Sept passes placent chaque ligne, font flotter chaque figure et équilibrent chaque colonne, en boucle jusqu’à ce que plus rien ne bouge.
- 0:54
À l’écranSection 04, « The virtual document » (« Le document virtuel ») : « Change a word. Only what changed is set again. » (« Changez un mot. Seul ce qui a changé est recomposé. »), avec la note « Like React’s virtual DOM, but for pages: the VDT, a virtual document tree. » (« Comme le DOM virtuel de React, mais pour des pages : le VDT, un arbre de document virtuel. ») Sept pages, de p. 7 à p. 13, se tiennent en rang ; un curseur marque une modification à la page 11, le reste de cette colonne passe à l’or avec la mention DIRTY (à refaire) et un filet de texte déborde sur la page 12, qui reçoit une coche et SETTLED (stabilisée), tandis que les pages précédentes indiquent SKIPPED (ignorée) et les suivantes UNTOUCHED (intacte). Trois puces énoncent la règle, et un panneau intitulé renderToHtmlIndexed() marque PATCHED (corrigés) les nœuds modifiés de l’arbre du document.
NarrationTout cela vit dans un document virtuel, comme le DOM virtuel de React. Changez un mot, et seul ce qui a changé est recomposé.
- 1:03
À l’écran« A long document? Only what’s on screen gets painted. » (« Un long document ? Seul ce qui est à l’écran est peint. ») Une colonne de pages de livre défile dans un cadre doré marqué VIEWPORT (zone d’affichage), avec une marge de 200 pixels au-dessus et au-dessous : les pages à l’intérieur sont dessinées en entier, celles de l’extérieur ne sont que des contours en pointillés. Un grand compteur montre combien des 48 pages sont peintes à ce moment-là (IntersectionObserver · +200 px), à côté de « Geometry: every page. Pixels: only what you see. » (« Géométrie : chaque page. Pixels : seulement ce que vous voyez. »)
NarrationEt dans un long livre, seules les pages à l’écran sont peintes.
- 1:10
À l’écranSection 05, « Knuth–Plass justification » (« Justification Knuth–Plass ») : « Every way to break the paragraph. At once. » (« Toutes les manières de couper le paragraphe. D’un coup. ») À gauche, un paragraphe sur la coupure des lignes est composé au premier ajustement, comme le fait un navigateur, et ses lignes les plus lâches virent au rouge. En dessous, chaque mot devient un point sur une ligne : des arcs rouges marquent les coupures gloutonnes, de pâles arcs bleus essaient toutes les coupures possibles et un chemin doré retient le meilleur ensemble. À droite, la version Knuth–Plass est espacée régulièrement, avec la laideur (badness) de chaque ligne, la formule « (1 + badness + penalty)² » et un total de démérites plus bas.
NarrationUn navigateur coupe les lignes de façon gloutonne, une à une. Postext utilise Knuth–Plass, l’algorithme de TeX. Il pèse toutes les façons de couper le paragraphe entier et garde la plus régulière.
- 1:24
À l’écranSection 06, « One layout, five outputs » (« Une mise en page, cinq sorties ») : « What you see is what goes to press. » (« Ce que vous voyez est ce qui part à l’impression. ») Sous la ligne de code const vdt = buildDocument(content, config); une page se divise en cinq. Canvas (renderToCanvas(), images matricielles au pixel près) reçoit une loupe sur sa grille de pixels ; HTML (renderToHtml(), texte sélectionnable, sensible au redimensionnement) voit chaque bloc détouré et étiqueté <h1>, <p>, <figure>, etc. ; PDF (renderToPdf(), prêt pour l’impression, PDF/UA, CMJN) fait glisser quatre plaques de couleur jusqu’au repérage, puis apparaissent les traits de coupe et une gamme de contrôle. EPUB 3 (renderToEpub(), livre numérique, fixe ou recomposable) montre la page dans une liseuse étiquetée « Fixed layout » (mise en page fixe) ; l’écran se rétrécit à la taille d’un téléphone, le texte se recompose et l’étiquette devient « Reflowable » (recomposable). Folio (postext-folio, un livre en 3D aux pages qui tournent) ouvre la page en double page et tourne un feuillet par-dessus le dos.
NarrationUne mise en page, cinq sorties : canvas, HTML, PDF prêt pour l’impression, EPUB 3, fixe ou recomposable, et un livre en 3D. Ce que vous voyez est ce qui part à l’impression.
- 1:41
À l’écranSection 07, « Why an open standard » (« Pourquoi un standard ouvert ») : « LaTeX set the bar for print. Publishing now lives on every screen, too. » (« LaTeX a placé la barre pour l’imprimé. L’édition vit désormais aussi sur tous les écrans. ») Deux cartes : LaTeX, 1984, avec des croix face à « Built for the printed page » (conçu pour la page imprimée), « Builds tied to one machine’s fonts & packages » (des compilations liées aux polices et aux paquets d’une machine), « Compile, wait, repeat » (compiler, attendre, recommencer) et « No editorial layout on the responsive web » (pas de mise en page éditoriale sur le web adaptatif) ; Postext, 2026, avec des coches face à « Web, print-ready PDF & EPUB 3 from one layout » (web, PDF prêt pour l’impression et EPUB 3 à partir d’une seule mise en page), « One portable .postext file carries it all » (un seul fichier .postext portable contient tout), « Reflows live, as you type » (se recompose en direct, pendant la frappe) et « Runs in any browser · zero servers · MIT » (fonctionne dans tout navigateur, sans serveur, sous licence MIT). La carte Postext s’illumine.
NarrationLaTeX a fixé la norme pour l’imprimé. Mais l’édition vit désormais sur tous les écrans.
- 1:48
À l’écranSurtitre « One file, the whole book » (« Un fichier, tout le livre »), titre « An open standard for publishing, beyond where LaTeX reaches. » (« Un standard ouvert pour l’édition, qui va plus loin que LaTeX. ») Une icône de fichier .postext éclate en cinq parties : preset.json (configuration et maquette), chapters/*.md (un fichier Markdown par chapitre), fonts/*.woff2 (les polices elles-mêmes), images/ · SVG (chaque image, incorporée) et resources (tableaux, figures et légendes). Légende : « A plain ZIP: open, documented, MIT-licensed. Any tool can read and write it. » (« Un simple ZIP : ouvert, documenté, sous licence MIT. N’importe quel outil peut le lire et l’écrire. »)
NarrationPostext est un standard ouvert : un fichier portable, documenté et sous licence MIT, que n’importe quel outil peut lire et écrire.
- 1:58
À l’écran« The showcase · set by the real engine » (« La vitrine, composée par le vrai moteur ») : un mur de pages de livre s’éloigne en perspective tandis qu’un compteur atteint 48 pages. Texte : « 12 chapters, 3 parts, a cover, laid out in about half a second. Every page of the Postext guide, computed in a browser by postext v1.7.0 for this film. Nothing placed by hand. » (« 12 chapitres, 3 parties, une couverture, mis en page en une demi-seconde environ. Chaque page du guide de Postext, calculée dans un navigateur par postext v1.7.0 pour ce film. Rien n’est placé à la main. ») Suivent des étiquettes : Textbooks, Magazines, Literary editions, Catalogues (manuels, magazines, éditions littéraires, catalogues).
NarrationC’est pourquoi il peut mettre en page des livres de plusieurs centaines de pages en quelques dixièmes de seconde.
- 2:05
À l’écranCarte de fin : le logo de Postext avec le slogan « The programmable typesetter for the web » (« Le compositeur programmable pour le web »), l’adresse postext.dev, une ligne de terminal qui tape « $ pnpm add postext », et le pied « Open source · MIT · github.com/drnachio/postext ».
NarrationPostext. Open source, sur postext.dev.
Chapitre 1 · Pourquoi Postext
La mise en page éditoriale, calculée pour le web
La typographie imprimée a passé cinq siècles à apprendre à composer une page ; les navigateurs ont appris à disposer une interface. Postext apporte la première aux seconds.
CSS vous donne une mise en page adaptative : flexbox, grid, colonnes. Mais il ne sait pas équilibrer des colonnes, garder un titre avec son paragraphe, éviter les veuves et les orphelines, ni faire flotter une figure en tête de la colonne suivante. Ce sont des décisions éditoriales, affinées au fil de siècles d’imprimerie.
Postext comble cet écart. Donnez-lui du Markdown sémantique et un objet de configuration. Il mesure le texte 300 à 600 fois plus vite que le DOM grâce à @chenglou/pretext (s’ouvre dans un nouvel onglet), puis calcule la géométrie complète de la page (chaque ligne, chaque flottant, chaque légende) et la rend par ses moteurs de rendu HTML, canvas ou PDF prêt pour l’impression.
Markdown en entrée
:::part{number="I" title="Fondements"
palette="band=#2b4acb"}
:::
# Pourquoi Postext {lead="La typographie
imprimée a mis cinq siècles…"}
Postext est un **moteur de mise
en page open source** qui apporte
au web le savoir-faire de la
typographie imprimée, comme le
montre :ref{id="fig-flow"}.
:::callout{type="try"}
Changez un mot : la page se
compose de nouveau.
:::Pages en sortie
En chiffres
- plus rapide que le DOM pour mesurer le texte : un livre entier se recompose pendant que vous tapez
- 300–600×plus rapide que le DOM pour mesurer le texte : un livre entier se recompose pendant que vous tapez
- sorties pour une seule mise en page : HTML, canvas, PDF prêt pour l’impression et EPUB 3
- 4sorties pour une seule mise en page : HTML, canvas, PDF prêt pour l’impression et EPUB 3
- PDF balisé et accessible, avec signets et couleurs CMJN
- PDF/UAPDF balisé et accessible, avec signets et couleurs CMJN
- serveur : le moteur tourne entièrement dans le navigateur, sous licence MIT
- 0serveur : le moteur tourne entièrement dans le navigateur, sous licence MIT
Chapitre 2 · Fonctionnalités
Ce que les typographes savaient déjà
Six choses dont une page a besoin et que CSS n’a jamais été conçu pour décider, calculées par le moteur, de la même façon à chaque fois.
- 2.1
Justification Knuth-Plass
Le même algorithme optimal de coupure des lignes que TeX, avec une césure par motifs TeX et le contrôle des orphelines : des blocs de texte au gris régulier, sans lézardes, bien au-delà de ce que CSS peut exprimer.
Lire dans la documentation - 2.2
Ressources et renvois
Les figures, les schémas SVG et les tableaux flottent en haut ou en bas des colonnes et des pages, comme les flottants de l’imprimé, avec une numérotation par type et des renvois :ref toujours à jour.
Lire dans la documentation - 2.3
Tableaux et légendes
Des tableaux composés avec une typographie distincte pour le corps et l’en-tête, répartis sur plusieurs pages avec répétition des en-têtes, et des légendes qui suivent votre configuration : numérotées et placées à côté de la ressource qu’elles décrivent.
Lire dans la documentation - 2.4
Schémas à une encre
Recolorez les schémas SVG en teintes d’une seule encre selon leur luminance, pour que chaque illustration s’accorde à votre maquette, prête pour l’impression en ton direct.
Lire dans la documentation - 2.5
Mathématiques LaTeX
Des équations en ligne et hors texte écrites en LaTeX, mesurées et composées par le moteur pour s’aligner sur la grille de ligne de base avec le texte.
Lire dans la documentation - 2.6
Web, PDF prêt pour l’impression et EPUB
Un moteur de mise en page, quatre sorties. Les mêmes pages calculées se rendent en HTML, canvas ou PDF prêt pour l’impression (avec signets, couleurs CMJN et sortie PDF/UA balisée et accessible) et partent en livre numérique EPUB 3, page à page ou recomposable.
Lire dans la documentation
Chaque page du guide de Postext (couverture, table des matières, pages de partie et le reste) est composée par Postext, dans votre navigateur, pendant que vous la lisez.
Vitrine
De vrais livres, composés dans votre navigateur
Un manuel, un magazine, un poème épique annoté, un catalogue d’exposition, un classique chinois en 120 chapitres, les Mille et Une Nuits en arabe, un roman japonais composé verticalement, une bande dessinée en sept langues. Ouvrez n’importe lequel dans le Sandbox, changez une règle et regardez chaque page se recomposer.
- Moteur de mise en page open sourcePostextChaque page est calculée dans votre navigateur
Le guide de Postext
Le guide intégré : 13 chapitres, trois parties, une couverture

Biochimie Feduchi · Chapitre 1
Un manuel de biochimie en colonne et demie : la colonne principale côté petit fond et une colonne extérieure de figures, de notions clés et d’activités

Ciel profond
Un magazine d’astronomie sur deux colonnes, avec ouvertures à fond perdu, encadrés et exergues

Don Quichotte · Gustave Doré
Une édition littéraire en colonne et demie, avec gloses marginales et planches de Doré

Physique (OpenStax)
Un manuel en colonne et demie avec exemples résolus, exercices de vérification, tableaux et formules

Le Paradis perdu · Gustave Doré
Une édition annotée du poème de Milton en douze livres : les notes de Verity en bas de page et les cinquante planches de Doré. En anglais uniquement

Peinture espagnole
Un catalogue d’exposition sur une colonne, notice et commentaire face à la planche en pleine page

Signaux 2020
Un magazine de l’AEE sur deux colonnes, avec ouvertures photographiques, encadrés, exergues et panneaux de données

Les Mille et Une Nuits · ألف ليلة وليلة
Les Mille et Une Nuits complètes en arabe, dans le texte de Boulaq : un livre égyptien classique relié à droite, chaque page dans un double filet, les nuits nommées en toutes lettres et les aquarelles de Sani ol-Molk. En arabe uniquement

Le Rêve dans le pavillon rouge · 紅樓夢
Un roman classique chinois en 120 chapitres, avec les planches de 1884 : le texte de 1792 en chinois traditionnel, composé verticalement et relié à droite, le même texte en chinois simplifié, et la traduction anglaise des 56 premiers chapitres par Joly

Kokoro · こころ
Le roman de Natsume Sōseki paru en 1914, en japonais, composé verticalement et relié à droite d’après la première édition Iwanami, avec la couverture, les pages de garde et la page de titre dessinées par Sōseki, trois de ses peintures et des furigana sur les mots les plus difficiles. En japonais uniquement

Pepper&Carrot · La fête d’anniversaire de Pepper
L’épisode 8 de la BD en ligne de David Revoy en huit langues : les cases originales sans texte, avec les bulles et le lettrage que le moteur compose à partir de chaque traduction officielle. L’édition japonaise est lettrée en colonnes et, comme l’édition arabe, se lit de droite à gauche et s’ouvre par la droite
Chapitre 3 · Méthode
Trois étapes vers une mise en page de qualité éditoriale
Le contenu en Markdown, la maquette dans un objet de configuration, les pages d’un seul appel de fonction.
- 3.1
Écrire du Markdown sémantique
Rédigez votre contenu en Markdown enrichi : titres, listes, tableaux, mathématiques, encadrés et renvois :ref vers vos figures. Aucune question de mise en page, seulement du contenu.
- 3.2
Configurer les règles de mise en page
Définissez le format de page, les colonnes, la typographie, le style des titres, les titres courants et le placement des flottants dans un objet PostextConfig, ou concevez la maquette visuellement dans le Sandbox.
- 3.3
Rendre en HTML, canvas ou PDF
Appelez buildDocument et recevez la géométrie complète de la mise en page, puis rendez-la avec le moteur de rendu HTML, canvas ou PDF prêt pour l’impression.
API
Une fonction, un contrôle total
Appelez buildDocument avec votre contenu et un objet de configuration. Vous obtenez la géométrie complète des pages : dessinez n’importe quelle page en image avec renderPage, ou composez le livre entier en PDF prêt pour l’impression avec renderToPdf.
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";
const doc = buildDocument(
{ markdown },
{
page: { sizePreset: "21x28" },
layout: { layoutType: "double" },
bodyText: {
fontSize: { value: 12, unit: "pt" },
textAlign: "justify",
hyphenation: { enabled: true, locale: "en-us" },
},
}
);
// Chaque page en image…
const cover = renderPage(doc.pages[0], doc);
cover.toBlob((png) => save(png, "cover.png"));
// …ou le livre entier en PDF prêt pour l’impression
// fontProvider : les octets TTF par famille et par graisse (voir la documentation)
const pdf = await renderToPdf(doc, { fontProvider });Chapitre 4 · Format ouvert
Un fichier, le livre entier
Un fichier .postext contient tout ce qu’il faut pour recomposer un document, sur n’importe quelle machine : un format ouvert et modifiable que chacun peut adopter.
La plupart des formats d’édition éparpillent un projet. Une compilation LaTeX dépend des polices et des paquets installés sur une machine, et les fichiers natifs des grands logiciels de mise en page renvoient à des images et à des polices conservées hors d’eux. Déplacez le projet, et quelque chose manque. Nous nous sommes heurtés nous-mêmes à ces limites avec LaTeX.
Un .postext est une simple archive ZIP que chacun peut ouvrir, lire et modifier : un manifeste JSON, un fichier Markdown par chapitre, et les fichiers de polices et les images eux-mêmes. Le Sandbox l’exporte, le skill d’agent postext-port l’écrit, et postext/bundle l’ouvre dans n’importe quel programme pour recomposer les mêmes pages. Le format est documenté et sous licence MIT, prêt à être lu et écrit par n’importe quel outil.
- 4.1
preset.jsonConfiguration. Page, grille, caractères, styles de titre et de paragraphe, couleurs et titres courants, en JSON lisible.
- 4.2
chapters/<lang>/*.mdChapitres. Un fichier Markdown par chapitre : ici, 14 chapitres en 2 langues.
- 4.3
fonts/*.woff2Caractères. Les fichiers de polices eux-mêmes, pas seulement leurs noms : 18 fichiers de Lora, Fraunces, Geist et Bricolage Grotesque.
- 4.4
preset.json › resourcesRessources. Légendes, numérotation, placement et contenu des tableaux pour les 26 figures et tableaux auxquels renvoie le texte.
- 4.5
resources/*.svgImages. Les illustrations elles-mêmes, en SVG ou en bitmap, avec la version de chaque langue : 38 fichiers.
Essayez
Ouvrir le guide, obtenir ses pages
Le premier exemple du Sandbox, le guide de Postext, est un seul fichier .postext. Ouvrez-le dans le navigateur et transformez chaque page en image : ses polices, ses figures et ses tableaux viennent du fichier lui-même.
Télécharger le guidepostext-guide.postext · 847 Koimport { openBundle, loadBundleFonts, registerBundleImages,
buildBundle, renderPageToCanvas } from "postext";
// Le guide du Sandbox : configuration, chapitres, polices et images
const file = await fetch("postext-guide.postext").then((r) => r.blob());
const book = await openBundle(file, { locale: "en" });
await loadBundleFonts(book); // ses propres polices
await registerBundleImages(book); // ses propres figures
// Chaque page de chaque chapitre, en image
for (const doc of buildBundle(book))
for (const page of doc.pages) {
const canvas = document.createElement("canvas");
renderPageToCanvas(page, doc, canvas, { scale: 0.5 });
document.body.append(canvas);
}Installation
Démarrer en moins d’une minute
Un seul paquet, sans serveur ni dépendance native. Ajoutez postext-pdf quand vous avez besoin de l’impression.
// Démarrage rapide
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";
const doc = buildDocument({
markdown: "# Hello World\n\nYour content here.",
});
// La première page, dessinée sur un canvas
document.body.append(renderPage(doc.pages[0], doc));
// Le document entier en PDF
const pdf = await renderToPdf(doc, { fontProvider });