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 +176 -10
- package/dist/api-types.d.ts +63 -4
- package/dist/diagnostics.d.ts +1 -1
- package/dist/export-options.d.ts +12 -0
- package/dist/image-geometry.d.ts +19 -0
- package/dist/image-input.d.ts +19 -0
- package/dist/image-pdf.d.ts +7 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1659 -363
- package/dist/layout.d.ts +4 -0
- package/dist/page-bands.d.ts +24 -0
- package/dist/page.d.ts +7 -3
- package/dist/pagination.d.ts +5 -1
- package/dist/pdf.d.ts +10 -1
- package/dist/progress.d.ts +11 -0
- package/dist/table-borders.d.ts +52 -0
- package/dist/text.d.ts +9 -0
- package/dist/tiff.d.ts +23 -0
- package/dist/types.d.ts +27 -1
- package/package.json +7 -4
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
|
|
8
|
-
|
|
9
|
-
calculates layout; RenderPDF.js uses
|
|
10
|
-
|
|
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.
|
|
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
|
-
##
|
|
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
|
|
94
|
-
rowspan cells remain atomic; oversized
|
|
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
|
|
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).
|
|
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.
|
package/dist/api-types.d.ts
CHANGED
|
@@ -48,26 +48,85 @@ export interface CustomPageSize {
|
|
|
48
48
|
/** Base paper height in CSS pixels, including margins. */
|
|
49
49
|
height: number;
|
|
50
50
|
}
|
|
51
|
-
/**
|
|
52
|
-
export interface
|
|
53
|
-
/**
|
|
54
|
-
|
|
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 {
|
package/dist/diagnostics.d.ts
CHANGED
|
@@ -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';
|