Pular para o conteúdo principal

Instalação

npm install json-pdf-designer

Peer deps: react e react-dom (^18.0.0 || ^19.0.0) — marcados optional em peerDependenciesMeta, então uma instalação só de backend nunca força eles (ver Uso só no servidor).

Importe o CSS do pacote uma vez, no entrypoint do seu app — ele estiliza o próprio <Designer> (painel de propriedades, toolbar, abas). Sem isso, alguns elementos do editor ficam com posição/cor errada, porque o Tailwind do seu app (se tiver) nunca escaneia o código desta lib:

import "json-pdf-designer/style.css";

dist/style.css é uma folha de estilo pré-compilada e independente — funciona com qualquer versão do Tailwind (ou nenhuma) no seu app.

Uso básico

import { useState } from "react";
import { Designer, generatePdf, downloadPdf, type Template, type Binding } from "json-pdf-designer";
import "json-pdf-designer/style.css";

const initialTemplate: Template = {
page: { width: 210, height: 297 }, // A4 em mm
schemas: [],
};

function Report() {
const [template, setTemplate] = useState<Template>(initialTemplate);
const [bindings, setBindings] = useState<Binding[]>([]);

async function handleGenerate() {
const data = await fetchMyData(); // o JSON de verdade que popula os campos
const pdfBytes = await generatePdf(template, data, bindings);
downloadPdf(pdfBytes, "relatorio.pdf");
}

return (
<>
<Designer
template={template}
onChangeTemplate={setTemplate}
bindings={bindings}
onChangeBindings={setBindings}
/>
<button onClick={handleGenerate}>Gerar PDF</button>
</>
);
}

onChangeTemplate/onChangeBindings aceitam a forma funcional do setState do React ((prev) => next) — use direto o setter do useState, como no exemplo, pra não perder um campo se dois forem adicionados em sequência rápida.