# react-pdf-engine

Offline Chromium PDF rendering for React and Tauri applications.

`react-pdf-engine` is only an HTML to PDF engine. It does not build documents,
inject dynamic fields, process forms, or provide a designer. Compose the HTML in
your app, then pass the final HTML string to this package.

## Install

```sh
npm install react-pdf-engine
```

The package uses `puppeteer-core`, so it does not download Chromium during npm
install. It resolves browsers in this order:

1. `executablePath` passed to `renderPdf`
2. Google Chrome on Windows
3. Microsoft Edge on Windows
4. bundled Chromium paths, including `REACT_PDF_ENGINE_CHROMIUM_PATH`

## Runtime

This package is a Node-side library. In a Tauri app, run it from a local sidecar
or service layer and call that layer from the React WebView.

## Usage

```ts
import { closePdfEngine, renderPdf } from "react-pdf-engine";

const pdf = await renderPdf({
  html: "<html><body><h1>Certificate</h1></body></html>",
  size: {
    width: "210mm",
    height: "297mm"
  },
  output: "buffer"
});

await renderPdf({
  html: "<html><body><h1>Marksheet</h1></body></html>",
  size: {
    width: "210mm",
    height: "297mm"
  },
  output: "file",
  outputPath: "C:/documents/marksheet.pdf"
});

await closePdfEngine();
```

## Options

```ts
type RenderPdfOptions = {
  html: string;
  size: {
    width: string;
    height: string;
  };
  margins?: {
    top?: string;
    right?: string;
    bottom?: string;
    left?: string;
  };
  landscape?: boolean;
  output?: "buffer" | "file";
  outputPath?: string;
  scale?: number;
  timeout?: number;
  executablePath?: string;
};
```

`output` defaults to `"buffer"`. When `output` is `"file"`, `outputPath` is
required and the parent directory must already exist.

## Rendering Guarantees

The engine uses Chromium's native print pipeline through `page.pdf()` with:

- `printBackground: true`
- `preferCSSPageSize: true`
- explicit viewport with `deviceScaleFactor: 2`
- print CSS injection for zero body/page margins and exact color printing

It does not use `html2canvas`, screenshots, canvas rasterization, or remote
rendering APIs.

## Assets And Fonts

Supported inputs include base64 images, file URLs, HTTPS images, SVG, PNG, JPEG,
WebP, and CSS `@font-face` declarations. The renderer waits for network idle,
`document.fonts.ready`, and image load/decode before generating the PDF.

If an asset fails to load, `renderPdf` throws `PdfEngineError` with code
`ASSET_LOAD_FAILED` and details about the failed asset URLs.

## Smoke Test

```sh
npm run smoke
```

The smoke script builds the package and renders `examples/output/smoke.pdf`
using the locally detected Chrome, Edge, or bundled Chromium path.
