renderpdf-js 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,10 +4,12 @@
4
4
 
5
5
  # RenderPDF.js
6
6
 
7
- An open-source TypeScript library for converting HTML/CSS to PDF in the browser,
8
- with selectable text, local raster fallbacks and automatic pagination. The browser
9
- calculates layout; RenderPDF.js uses its measured text, box, image and table
10
- coordinates to write the PDF. Conversion runs entirely on the client.
7
+ An open-source TypeScript library for converting HTML/CSS and standalone images
8
+ to PDF in the browser. HTML exports retain selectable text, local raster fallbacks
9
+ and automatic pagination. The browser calculates HTML layout; RenderPDF.js uses
10
+ its measured text, box, image and table coordinates to write the PDF. Standalone
11
+ PNG/JPEG and multipage TIFF files use a separate image API. Conversion runs
12
+ entirely on the client.
11
13
 
12
14
  The renderer is experimental and supports the bounded subset described below.
13
15
  Chromium is the verified browser; Firefox/Safari compatibility has not been
@@ -21,12 +23,68 @@ Install the library in a browser application with a bundler, such as Vite:
21
23
  npm install renderpdf-js
22
24
  ```
23
25
 
24
- The package provides an ESM entry and TypeScript declarations. Version 0.1.x is
26
+ The package provides an ESM entry and TypeScript declarations. Version 0.x is
25
27
  experimental; review the supported scope and limits before using it for documents.
26
28
  To try HTML preview and PDF download from a source checkout, run the independent
27
29
  [playground](https://github.com/MichalekJan93/renderPDF.js/tree/main/playground).
28
30
 
29
- ## Usage
31
+ ## Standalone image files
32
+
33
+ `imageToPDF` is available from version 0.2.0. It accepts one `File`/`Blob`, `ArrayBuffer` or
34
+ `Uint8Array`; actual file signatures determine the format, not filenames or MIME
35
+ labels. No HTML element or registered fonts are needed.
36
+
37
+ ```ts
38
+ import { imageToPDF } from 'renderpdf-js';
39
+
40
+ const file = fileInput.files?.[0];
41
+ if (!file) throw new Error('Select a PNG, JPEG or TIFF file.');
42
+
43
+ const pdf = await imageToPDF(file, {
44
+ format: 'A4',
45
+ margin: 24,
46
+ metadata: { title: 'Scanned document' },
47
+ onProgress: ({ stage, completed, total }) => {
48
+ statusElement.textContent = `${stage}: ${completed}/${total}`;
49
+ },
50
+ });
51
+ await pdf.download('document.pdf');
52
+ ```
53
+
54
+ PNG/JPEG produce one PDF page. Every main linked TIFF frame produces its own page
55
+ in file order. Images fit completely inside the selected paper's margins, retain
56
+ their aspect ratio and are centered; fitting can enlarge a small image. The
57
+ defaults are A4 portrait and 24 CSS-pixel margins. A3, Letter, landscape,
58
+ asymmetric margins and custom paper sizes use the same settings as HTML exports.
59
+ TIFF/EXIF orientations 1–8, including mirrored orientations and PNG `eXIf`, are
60
+ applied when painting the page. JPEG compressed bytes remain unchanged.
61
+
62
+ The result has the same `pageCount`, `download()`, `toBlob()` and
63
+ `toUint8Array()` methods as HTML exports. Image text remains part of the bitmap;
64
+ this API does not perform OCR. Metadata and mutable input bytes are copied before
65
+ the first asynchronous stage. Cancellation uses `signal`. Progress stages are
66
+ `preparing`, `resources`, `pages`, `saving` and `complete`; image conversion does
67
+ not emit HTML layout/pagination stages. Resource/page totals equal the number of
68
+ image frames. A failed or canceled conversion returns no partial PDF.
69
+
70
+ Supported TIFF input is classic TIFF with strips and either byte order, using
71
+ uncompressed, CCITT RLE/Group 3/Group 4, LZW, PackBits or Deflate compression.
72
+ The bounded decoder supports common bilevel/grayscale, palette and 8-bit RGB/RGBA
73
+ profiles, including associated alpha normalization. Other modes, including
74
+ BigTIFF, tiles, SubIFDs/RAW layouts, planar-separated samples, 16-bit/float samples
75
+ and JPEG-compressed TIFF, fail with `UNSUPPORTED_IMAGE`. Frames are limited to
76
+ 40 million pixels each and TIFF files to 1,000 main frames. PNG must be static;
77
+ APNG is rejected explicitly. JPEG supports 8-bit baseline/extended/progressive
78
+ grayscale, RGB and CMYK frames.
79
+
80
+ Malformed headers, checksums and out-of-file offsets are rejected. JPEG entropy
81
+ validation and detection of every corrupt CCITT bitstream remain decoder-limited;
82
+ structural checks do not prove that every damaged scan is recoverable. TIFF
83
+ pixels are decoded one frame at a time with the MIT-licensed `utif2` dependency,
84
+ which loads only when TIFF decoding is requested. The HTML `<img>` pipeline still
85
+ accepts native PNG/JPEG resources; standalone TIFF support does not change it.
86
+
87
+ ## HTML usage
30
88
 
31
89
  Import the public API from the installed package in your application's browser entry:
32
90
 
@@ -80,6 +138,93 @@ registration require a browser document.
80
138
  Variable fonts, WOFF/WOFF2 and font collections are rejected; supply static
81
139
  TTF/OTF instances. Do not remove or replace registered browser faces during use.
82
140
 
141
+ ### Repeated table headers and page text
142
+
143
+ Repeated table headers and page text are available from version 0.2.0.
144
+
145
+ ```ts
146
+ const pdf = await renderPDF(source, {
147
+ fonts: [regular],
148
+ margin: 24,
149
+ repeatTableHeaders: true,
150
+ header: { text: 'Account statement', height: 32, fontSize: 12 },
151
+ footer: {
152
+ text: 'Page {pageNumber} of {pageCount}',
153
+ height: 28,
154
+ fontSize: 11,
155
+ align: 'right',
156
+ },
157
+ });
158
+ await pdf.download('statement.pdf');
159
+ ```
160
+
161
+ `repeatTableHeaders` defaults to `false`, preserving existing exports. Enabling it
162
+ repeats native `thead` paint and selectable text on continuation pages of a table.
163
+ The header's measured height and spacing reduce the available body space on those
164
+ pages. The original header stays together with the first body row. Body rows and
165
+ spanning cells remain indivisible; a header and row that cannot fit fail with
166
+ `PAGINATION_FAILED`. Repeated headers require nonnested native tables with a
167
+ visible `thead` followed by body rows; raster headers, overlapping table ranges,
168
+ header rowspans and cells spanning the header/body boundary are unsupported. Table footers are
169
+ not repeated.
170
+ Header paint must fit inside the measured `thead` box; text overflowing into its
171
+ surrounding spacing fails explicitly instead of being clipped on continuation pages.
172
+
173
+ `header` and `footer` each reserve their required `height` in CSS pixels **in
174
+ addition to** the page's outer margins. They accept one plain Latin text line,
175
+ including Czech diacritics, with `{pageNumber}` and `{pageCount}` placeholders.
176
+ The text is black, vertically centered, and remains selectable. `fontSize`
177
+ defaults to 12 CSS pixels and `align` to `'left'`; `'center'` and `'right'` are
178
+ also supported. `font` can select a registered handle included in `fonts`, and
179
+ otherwise defaults to the first supplied face. Band text never wraps or shrinks
180
+ silently: text that exceeds its reserved height or available width fails with
181
+ `SOURCE_OVERFLOW`. Invalid settings or bands leaving no content area fail with
182
+ `INVALID_OPTIONS`. HTML templates and per-page callbacks are not supported.
183
+
184
+ ### Export progress and document properties
185
+
186
+ Progress reporting and document properties are available from version 0.2.0.
187
+
188
+ ```ts
189
+ const pdf = await renderPDF(source, {
190
+ fonts: [regular],
191
+ metadata: {
192
+ title: 'Account statement',
193
+ author: 'Example Company',
194
+ subject: 'Quarterly overview',
195
+ keywords: ['statement', 'quarterly'],
196
+ },
197
+ onProgress: ({ stage, completed, total }) => {
198
+ // Keep the status element outside the document being exported.
199
+ statusElement.textContent = `${stage}: ${completed}/${total}`;
200
+ },
201
+ });
202
+ await pdf.download('statement.pdf');
203
+ ```
204
+
205
+ Progress events are frozen records with `stage`, `completed` and `total` fields.
206
+ Stages are `preparing`, `layout`, `pagination`, `resources`, `pages`, `saving`
207
+ and `complete`, in that order. Counters describe work **within the current stage**,
208
+ not elapsed-time percentages. Preparation, layout, pagination and saving use one
209
+ work unit; resources count font programs and processed native image/raster
210
+ references, including reused image references. The page stage counts finished
211
+ physical pages; its total is known after pagination. A successful export ends
212
+ with `{ stage: 'complete', completed: 1, total: 1 }` after source validation.
213
+
214
+ Providing `onProgress` allows periodic browser task yields so status updates and
215
+ cancellation can run during export. Without it, conversion adds no progress
216
+ timers. Callbacks are synchronous notifications; thrown callback errors reject
217
+ the export with the original error. Keep the source static during callbacks as
218
+ well as asynchronous rendering. Cancellation continues to use `signal` and the
219
+ standard `AbortError`, with no partial PDF returned.
220
+
221
+ `metadata` accepts optional Unicode `title`, `author`, `subject` and `keywords`
222
+ properties. The keywords value is an array of strings. Settings and keyword
223
+ entries are copied before the first asynchronous stage; later caller edits do
224
+ not alter the current PDF. Invalid runtime values fail with `INVALID_OPTIONS`.
225
+ The default title remains `RenderPDF.js`. Metadata does not add visible page
226
+ content or change font requirements.
227
+
83
228
  ## Supported scope
84
229
 
85
230
  - Static block, inline, nonoverlapping Flexbox and Grid geometry with horizontal
@@ -90,8 +235,9 @@ TTF/OTF instances. Do not remove or replace registered browser faces during use.
90
235
  Other image formats fail explicitly. External images can require a browser
91
236
  fetch at export time; document data is never submitted to a conversion service.
92
237
  JPEG EXIF orientation must be absent or 1; normalize rotated image pixels first.
93
- - Legacy `FONT`, `CENTER` and simple tables with separate borders. Table rows and
94
- rowspan cells remain atomic; oversized atomic content fails.
238
+ - Legacy `FONT`, `CENTER` and native tables with separate or collapsed borders.
239
+ Collapsed borders are available from version 0.2.0. Table rows and rowspan cells remain atomic; oversized
240
+ atomic content fails.
95
241
  - A4, A3 and Letter, portrait/landscape, a numeric margin or four explicit edges.
96
242
  Custom paper uses `format: { width: 500, height: 400 }`; dimensions include
97
243
  margins. Landscape swaps the supplied base axes, including custom dimensions.
@@ -116,6 +262,23 @@ TTF/OTF instances. Do not remove or replace registered browser faces during use.
116
262
  adjacent complete block siblings together when they fit. `pageBreak: 'auto'`
117
263
  ignores authored fragmentation hints and uses only measured atomic geometry.
118
264
 
265
+ Collapsed tables support cell and outer-table borders with `solid`, `none` and
266
+ `hidden` styles, including different widths/colors on each side, transparency,
267
+ `rowspan` and `colspan`. Shared edges resolve conflicts before native painting:
268
+ hidden suppresses a border, otherwise the wider solid candidate wins; cells
269
+ outrank the table on equal widths, followed by the upper/left cell in LTR layout.
270
+ Crossing fills are partitioned so transparency is not applied twice. Original
271
+ browser column widths and selectable text are retained; no table screenshot is
272
+ used. Outer borders stay with the first/last complete rows during pagination.
273
+
274
+ Collapsed row, row-group, column and column-group border contributions, other
275
+ border styles, nested collapsed tables, captions and altered native table-part
276
+ display modes fail explicitly. Keep these contributions on cells or the table
277
+ itself. Repeated headers on collapsed tables additionally require the same
278
+ resolved horizontal border segments, widths and colors at every possible body
279
+ continuation boundary; incompatible combinations fail with `UNSUPPORTED_CSS`.
280
+ Repeated headers on tables with separate borders retain their existing scope.
281
+
119
282
  Page mapping keeps consecutive source intervals: native backgrounds and boxes may
120
283
  span pages, while measured text lines, images, raster regions, table rows and
121
284
  rowspan cells remain atomic. Fitting avoid blocks move intact to the next page.
@@ -149,7 +312,8 @@ and soft hyphens fail explicitly. Keep shaped words in one text node; cross-inli
149
312
  ligatures and zero-width text fragments are unsupported and reject explicitly.
150
313
  Exact output across shaping engines, arbitrary ligatures, complex scripts, bidi
151
314
  and variable font instances are not a fidelity promise. There is no arbitrary CSS/stacking
152
- engine, collapsed table borders, repeated table headers or header/footer engine.
315
+ engine. Collapsed tables, repeated table headers and plain page text
316
+ use the explicit options described above; arbitrary HTML page templates are unsupported.
153
317
  Pagination is a measured source-to-page mapping, not full CSS Paged Media: parity
154
318
  breaks (`left/right/recto/verso`), column breaks, inline/cell break directives,
155
319
  margin-break rules, widow/orphan line-count policies and cloned page decorations
@@ -219,6 +383,8 @@ the package version and verifying the packed consumer.
219
383
 
220
384
  ## License
221
385
 
222
- RenderPDF.js is licensed under the [MIT License](LICENSE). Bundled Noto Sans and Noto Serif test
386
+ RenderPDF.js is licensed under the [MIT License](LICENSE). The TIFF decoder
387
+ `utif2` retains its MIT license; its `pako` dependency retains its MIT/Zlib notices.
388
+ Runtime dependencies remain external to the library bundle. Bundled Noto Sans and Noto Serif test
223
389
  fonts retain their [SIL Open Font License](https://github.com/MichalekJan93/renderPDF.js/blob/main/public/fonts/README.md); they are not
224
390
  bundled into the library entry. Third-party dependencies retain their own licenses.
@@ -48,26 +48,85 @@ export interface CustomPageSize {
48
48
  /** Base paper height in CSS pixels, including margins. */
49
49
  height: number;
50
50
  }
51
- /** Small supported API surface; unsupported layout fails explicitly. */
52
- export interface RenderPDFOptions {
53
- /** Explicit registered faces used by the supplied source; no implicit font substitution. */
54
- fonts: readonly RegisteredFont[];
51
+ /** One selectable line repeated in a reserved area above or below each page's content. */
52
+ export interface PageTextOptions {
53
+ /** Plain Latin text; {pageNumber} and {pageCount} expand after pagination. */
54
+ text: string;
55
+ /** Reserved height in CSS pixels, in addition to the page's outer margins. */
56
+ height: number;
57
+ /** Exact face included in fonts; defaults to its first registered face. */
58
+ font?: RegisteredFont;
59
+ /** Text size in CSS pixels, defaulting to 12. */
60
+ fontSize?: number;
61
+ /** Horizontal alignment within the page's content width, defaulting to left. */
62
+ align?: 'left' | 'center' | 'right';
63
+ }
64
+ /** Document properties stored in the PDF, independent of visible page content. */
65
+ export interface PDFMetadata {
66
+ /** Human-readable document title; defaults to RenderPDF.js when omitted. */
67
+ title?: string;
68
+ /** Author displayed in PDF document properties. */
69
+ author?: string;
70
+ /** Short description of the document's subject. */
71
+ subject?: string;
72
+ /** Search keywords copied before export begins. */
73
+ keywords?: readonly string[];
74
+ }
75
+ /** Observable export stages; counters describe work within one stage, never elapsed-time estimates. */
76
+ export type RenderStage = 'preparing' | 'layout' | 'pagination' | 'resources' | 'pages' | 'saving' | 'complete';
77
+ /** Immutable progress notification delivered synchronously to the application's callback. */
78
+ export interface RenderProgress {
79
+ /** Current stage, in pipeline order. */
80
+ readonly stage: RenderStage;
81
+ /** Finished work units within the current stage. */
82
+ readonly completed: number;
83
+ /** Known work units in this stage; page totals are available after pagination. */
84
+ readonly total: number;
85
+ }
86
+ /** Shared physical paper settings for HTML and standalone image conversion. */
87
+ export interface PDFPageOptions {
55
88
  /** Standard page size (default A4) or explicit physical dimensions in CSS pixels. */
56
89
  format?: 'A4' | 'A3' | 'Letter' | CustomPageSize;
57
90
  /** Page orientation, defaulting to portrait. */
58
91
  orientation?: 'portrait' | 'landscape';
59
92
  /** CSS-pixel margins, defaulting to 24 on every edge; content is never implicitly rescaled. */
60
93
  margin?: number | PageMargins;
94
+ }
95
+ /** Small supported API surface; unsupported layout fails explicitly. */
96
+ export interface RenderPDFOptions extends PDFPageOptions {
97
+ /** Explicit registered faces used by the supplied source; no implicit font substitution. */
98
+ fonts: readonly RegisteredFont[];
61
99
  /** Physical pixels per CSS pixel in selected local raster regions, defaulting to 2. */
62
100
  rasterScale?: number;
63
101
  /** Automatically rasterize safe local effects (default auto); strict requires explicit data-raster. */
64
102
  fallback?: 'auto' | 'strict';
65
103
  /** Honor supported CSS page breaks (default css), or use geometry-only automatic cuts. */
66
104
  pageBreak?: 'auto' | 'css';
105
+ /** Repeat native THEAD groups on table continuation pages; defaults to false. */
106
+ repeatTableHeaders?: boolean;
107
+ /** Plain text vertically centered in a reserved area above the source on every page. */
108
+ header?: PageTextOptions;
109
+ /** Plain text vertically centered in a reserved area below the source on every page. */
110
+ footer?: PageTextOptions;
111
+ /** Unicode document properties; all supplied values are copied before asynchronous preparation. */
112
+ metadata?: PDFMetadata;
67
113
  /** Stop preparation and subsequent rendering stages without producing a partial PDF. */
68
114
  signal?: AbortSignal;
69
115
  /** Observe documented approximations, raster choices and relaxed pagination preferences. */
70
116
  onWarning?: (warning: RenderWarning) => void;
117
+ /** Observe stage-local work counts; the renderer yields for browser updates when provided. */
118
+ onProgress?: (progress: RenderProgress) => void;
119
+ }
120
+ /** One caller-owned image file or its complete binary bytes; the signature determines its format. */
121
+ export type ImageSource = Blob | ArrayBuffer | Uint8Array;
122
+ /** Convert one PNG/JPEG or all main image frames of a TIFF, without HTML or font registration. */
123
+ export interface ImagePDFOptions extends PDFPageOptions {
124
+ /** Copied Unicode PDF properties. */
125
+ metadata?: PDFMetadata;
126
+ /** Cancel between input reading, frame decoding, image embedding and page writing stages. */
127
+ signal?: AbortSignal;
128
+ /** Frozen stage-local counters; image conversion omits HTML layout/pagination stages. */
129
+ onProgress?: (progress: RenderProgress) => void;
71
130
  }
72
131
  /** Complete PDF result with independently usable browser output forms. */
73
132
  export interface RenderPDFResult {
@@ -1,5 +1,5 @@
1
1
  /** Machine-readable failure reasons for the supported browser rendering pipeline. */
2
- export type RenderErrorCode = 'INVALID_OPTIONS' | 'INVALID_SOURCE' | 'FONT_LOAD_FAILED' | 'MISSING_FONT' | 'MISSING_GLYPH' | 'UNSUPPORTED_CSS' | 'UNSUPPORTED_ELEMENT' | 'RESOURCE_LOAD_FAILED' | 'SOURCE_CHANGED' | 'SOURCE_OVERFLOW' | 'PAGINATION_FAILED' | 'RASTER_FAILED' | 'PDF_WRITE_FAILED';
2
+ export type RenderErrorCode = 'INVALID_OPTIONS' | 'INVALID_SOURCE' | 'FONT_LOAD_FAILED' | 'MISSING_FONT' | 'MISSING_GLYPH' | 'UNSUPPORTED_CSS' | 'UNSUPPORTED_ELEMENT' | 'UNSUPPORTED_IMAGE' | 'RESOURCE_LOAD_FAILED' | 'SOURCE_CHANGED' | 'SOURCE_OVERFLOW' | 'PAGINATION_FAILED' | 'RASTER_FAILED' | 'PDF_WRITE_FAILED';
3
3
  /** A rendering failure with a stable code and an actionable English explanation. */
4
4
  export declare class RenderPDFError extends Error {
5
5
  /** Stable category that callers can branch on without parsing message text. */
@@ -0,0 +1,12 @@
1
+ import type { PDFMetadata } from './api-types.js';
2
+ import type { PDFDocument } from 'pdf-lib';
3
+ /** Validate and own metadata before the caller can mutate nested settings during an export. */
4
+ export declare function resolveMetadata(
5
+ /** Optional caller-owned PDF document properties. */
6
+ value: PDFMetadata | undefined): Readonly<PDFMetadata> | undefined;
7
+ /** Apply the same document properties for HTML and standalone image exports. */
8
+ export declare function applyPDFMetadata(
9
+ /** PDF document owning these Info dictionary values. */
10
+ pdf: PDFDocument,
11
+ /** Validated, copied properties; omitted fields retain the shared defaults. */
12
+ metadata: Readonly<PDFMetadata> | undefined): void;
@@ -0,0 +1,19 @@
1
+ import type { PageGeometry } from './api-types.js';
2
+ /** Bound per-frame decoding allocations while allowing typical 600-DPI A4 scans. */
3
+ export declare const MAX_IMAGE_PIXELS = 40000000;
4
+ /** Reject invalid and excessive dimensions before a decoder allocates pixel buffers. */
5
+ export declare function assertImageSize(
6
+ /** Encoded pixel width, before orientation. */
7
+ width: number,
8
+ /** Encoded pixel height, before orientation. */
9
+ height: number): void;
10
+ /** Fit and orient an image's unit square inside the page, returning a CSS-pixel PDF matrix. */
11
+ export declare function imagePlacement(
12
+ /** Original encoded image width. */
13
+ width: number,
14
+ /** Original encoded image height. */
15
+ height: number,
16
+ /** TIFF/EXIF orientation, including mirrored variants. */
17
+ orientation: number,
18
+ /** Physical page with validated margins. */
19
+ page: PageGeometry): [number, number, number, number, number, number];
@@ -0,0 +1,19 @@
1
+ /** Validated native bitmap geometry; orientation transforms are applied by the PDF adapter. */
2
+ export interface BitmapInfo {
3
+ /** Actual compressed format, independent of the filename and MIME type. */
4
+ format: 'png' | 'jpeg';
5
+ /** Encoded pixel width before EXIF rotation. */
6
+ width: number;
7
+ /** Encoded pixel height before EXIF rotation. */
8
+ height: number;
9
+ /** Standard EXIF orientation, defaulting to one when absent. */
10
+ orientation: number;
11
+ }
12
+ /** Inspect PNG/JPEG bytes without a DOM, mutation, implicit file-type guessing or pixel allocation. */
13
+ export declare function inspectBitmap(bytes: Uint8Array): BitmapInfo;
14
+ /** Validate PNG's complete zlib stream and row layout before pdf-lib's permissive raw inflater. */
15
+ export declare function validatePngData(
16
+ /** Owned PNG bytes; filenames and MIME types never establish their validity. */
17
+ bytes: Uint8Array,
18
+ /** Optional cancellation released together with the native reader. */
19
+ signal?: AbortSignal): Promise<void>;
@@ -0,0 +1,7 @@
1
+ import type { ImagePDFOptions, ImageSource, RenderPDFResult } from './api-types.js';
2
+ /** Convert one standalone PNG/JPEG or every main TIFF frame to an immutable PDF result. */
3
+ export declare function imageToPDF(
4
+ /** Complete image bytes or browser File/Blob; filenames and MIME types do not determine decoding. */
5
+ source: ImageSource,
6
+ /** Shared paper settings, metadata, cancellation and optional stage-local progress. */
7
+ options?: ImagePDFOptions): Promise<RenderPDFResult>;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { renderPDF } from './render-pdf.js';
2
+ export { imageToPDF } from './image-pdf.js';
2
3
  export { registerFont } from './fonts.js';
3
4
  export { RenderPDFError } from './diagnostics.js';
4
5
  export type { RenderErrorCode, RenderWarning } from './diagnostics.js';
5
- export type { FontSource, RegisteredFont, PageMargins, CustomPageSize, RenderPDFOptions, RenderPDFResult, } from './api-types.js';
6
+ export type { FontSource, RegisteredFont, PageMargins, PDFPageOptions, ImageSource, ImagePDFOptions, CustomPageSize, PageTextOptions, PDFMetadata, RenderStage, RenderProgress, RenderPDFOptions, RenderPDFResult, } from './api-types.js';