@pdfluent/sdk-wasm 1.0.0-beta.8 → 1.0.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.
@@ -0,0 +1,212 @@
1
+ PDFluent Commercial Licence
2
+ ===========================
3
+
4
+ Version 3.0 — 6 September 2026
5
+ Innovation Trigger B.V., trading as PDFluent, Netherlands.
6
+
7
+ This licence replaces version 2.0 of 31 August 2026, which described the same
8
+ rights sold as a perpetual licence through a signed order form. The rights are
9
+ unchanged. What changed on 6 September 2026 is how the licence is bought and how
10
+ long it runs: four self-service prices, yearly, bought on the website in a
11
+ minute. Version 1.0 of 2 May 2026, which described licence keys, tiers and an
12
+ expiring evaluation, described a product that no longer exists.
13
+
14
+ Licences granted under version 2.0 or earlier were perpetual for the versions
15
+ they named and remain so. Nothing in this text withdraws or replaces them.
16
+
17
+
18
+ 1. Why this licence exists
19
+ --------------------------
20
+
21
+ PDFluent is published under the GNU AGPLv3 (the LICENSE file). That is the
22
+ default, and it is the complete product: no feature is withheld, no key is
23
+ required, nothing expires.
24
+
25
+ The AGPL asks something in return. If you convey the software, or let users
26
+ interact with a modified version over a network, you must offer those users the
27
+ corresponding source under the same licence. For many organisations that is
28
+ fine. For some it is impossible — because the surrounding product is closed, or
29
+ a customer contract forbids it, or the legal department will not accept a
30
+ copyleft obligation in a shipped binary.
31
+
32
+ This licence is the alternative for exactly that case. You are not buying
33
+ features. You are buying the right not to publish your own source.
34
+
35
+
36
+ 2. What you get
37
+ ---------------
38
+
39
+ On payment of the fee, PDFluent grants the licensee a non-exclusive, worldwide
40
+ licence, for the term in section 8, to use, modify and distribute the PDFluent
41
+ software in the licensee's own products, without the obligations of the AGPL.
42
+ What the licensee conveyed to its own customers during the term stays covered
43
+ after it: the term bounds which releases may be taken under this licence, never
44
+ how long what was already shipped may be used.
45
+
46
+ Specifically:
47
+
48
+ a. Distribution of the software as part of a compiled product, without
49
+ supplying source to the recipients.
50
+ b. Operation as a network service, without the AGPL section 13 obligation.
51
+ c. Internal use of any kind.
52
+ d. Deployment in environments without network access. Nothing in the software
53
+ contacts a server, so this needs no permission and costs nothing extra.
54
+
55
+ The scope of one licence and its price are in section 2a below. Nothing in the
56
+ software distinguishes a licensed build from an unlicensed one, so nothing stops
57
+ working when a licence ends: see sections 5 and 8.
58
+
59
+
60
+ 2a. The four prices
61
+ -------------------
62
+
63
+ All yearly, in euro, excluding VAT, bought at https://pdfluent.com/sdk/pricing
64
+ and cancellable at any time in the billing portal there.
65
+
66
+ Commercial 999 per organisation. Grants b and c, and a for a product
67
+ the licensee does not sell PDF functionality from.
68
+ Unlimited developers.
69
+ OEM Startup 2,499 per product. Grants a, b and c without that limit, for
70
+ an organisation whose revenue is below EUR 1,000,000,
71
+ declared by the licensee at the time of purchase. Above
72
+ that threshold the OEM price applies from the next
73
+ renewal.
74
+ OEM 9,999 per product. The same grants, every other organisation.
75
+ Priority 4,999 Not a licence. A support subscription: a reply within
76
+ support one working day, on working days. Section 6 otherwise
77
+ applies.
78
+
79
+ The rule that decides Commercial from OEM, which is the only distinction
80
+ between them that matters:
81
+
82
+ If your customers pay you for PDF functionality that PDFluent provides — a
83
+ conversion API, a PDF/A service, an OCR service, hosted PDF tooling — that is
84
+ OEM, not Commercial.
85
+
86
+ Building PDF handling into your own product is Commercial. Selling PDF handling
87
+ to your customers is OEM. A licence covers one organisation or one named
88
+ product, as stated above; a second product is a second licence.
89
+
90
+
91
+ 3. What is not covered
92
+ ----------------------
93
+
94
+ Several components in the repository are forks of third-party open-source
95
+ projects and remain under their own permissive licences. They are not PDFluent's
96
+ to relicense and need no licence from PDFluent. `NOTICE` records which they are;
97
+ `docs/licensing/boundary.toml` is the machine-readable version.
98
+
99
+ This licence covers the components on PDFluent's side of that boundary.
100
+
101
+
102
+ 4. Attribution
103
+ --------------
104
+
105
+ Documents produced by the software carry "PDFluent" in the PDF `/Producer` entry
106
+ and in XMP metadata. Under this licence you may remove or replace that string in
107
+ your build. So may an AGPL licensee: the attribution term that once required
108
+ that string to be preserved was withdrawn with the move to AGPL-3.0-only, and
109
+ nothing replaced it. What a commercial licence changes is the copyleft, not
110
+ the branding.
111
+
112
+
113
+ 5. What this licence does not contain, and why
114
+ ----------------------------------------------
115
+
116
+ No telemetry, no licence key, and no check of any kind in the software.
117
+
118
+ Stated accurately rather than aspirationally: until 6 September 2026 the build
119
+ still carried tier checks from the previous model, so an unlicensed binary
120
+ reported `Tier::Trial` and refused some capabilities. Those checks are gone
121
+ (issue #226). No code in the software reads a key, refuses a capability, or
122
+ marks output, and `scripts/ci/no_licence_key_in_a_binding.py` refuses a change
123
+ that puts one back. It was never a condition of this licence — a commercial
124
+ licensee's rights come from this agreement, not from a check in the binary.
125
+
126
+ This is deliberate, not an omission. Published source means any technical check
127
+ can be removed by anyone who has the code, in minutes, so such a check would
128
+ only ever inconvenience the people who intended to pay. The obligation here is
129
+ contractual, and it is enforceable in the ordinary way.
130
+
131
+ Consequently there is nothing to install, nothing to activate, and nothing that
132
+ can break in production because a file expired or a server was unreachable. A
133
+ licence that lapses is a change in what the licensee may do, never a change in
134
+ what the software does.
135
+
136
+ What a licensee receives is the order confirmation issued at purchase and a
137
+ licence document naming the licensee, the licence, the product where one
138
+ applies, and the term. Those two together are the licence, and they are the
139
+ deliverables. A signed order form is available for a licensee whose procurement
140
+ requires one; it is not the ordinary route and it changes nothing about the
141
+ rights.
142
+
143
+
144
+ 6. Support and updates
145
+ ----------------------
146
+
147
+ This licence grants rights to the software. It is not a support contract and
148
+ does not promise response times or fixes. Every release published during the
149
+ term may be taken under it, which is what a licensee is buying when they renew.
150
+
151
+ A response time is promised only where priority support is bought (section 2a),
152
+ or where a separate services agreement says so; either prevails over this
153
+ section.
154
+
155
+
156
+ 7. Warranty and liability
157
+ -------------------------
158
+
159
+ The software is provided "as is", without warranty of any kind, express or
160
+ implied, including but not limited to the warranties of merchantability, fitness
161
+ for a particular purpose and non-infringement.
162
+
163
+ To the maximum extent permitted by applicable law, PDFluent's aggregate
164
+ liability under or in connection with this licence shall not exceed the fees
165
+ paid by the licensee for it. Nothing in this licence excludes or limits
166
+ liability that cannot lawfully be excluded or limited, including liability for
167
+ intentional misconduct or gross negligence.
168
+
169
+
170
+ 8. Term and termination
171
+ -----------------------
172
+
173
+ The licence runs for the term paid for and renews yearly until the licensee
174
+ cancels. Cancellation takes effect at the end of the paid term.
175
+
176
+ When the term ends, the licensee's rights under section 2 end with it. Nothing
177
+ breaks: no release stops working, nothing already shipped is affected, and no
178
+ code in the software consults this agreement. What ends is the right to convey
179
+ or operate releases under this licence rather than under the AGPL. Rights
180
+ already granted to the licensee's own customers for versions already shipped are
181
+ not affected, and neither is anything the licensee shipped during the term.
182
+
183
+ The licence also terminates on a material breach that the licensee has not
184
+ remedied within 30 days of written notice.
185
+
186
+
187
+ 9. Law and forum
188
+ ----------------
189
+
190
+ This licence is governed by the laws of the Netherlands. Disputes are submitted
191
+ to the competent court in the district where PDFluent has its registered seat,
192
+ without prejudice to any mandatory consumer or statutory forum.
193
+
194
+
195
+ 10. The agreement
196
+ -----------------
197
+
198
+ For a self-service purchase, the agreement is this text together with the order
199
+ confirmation and the licence document described in section 5. Those record the
200
+ licensee, the licensed scope, the product where one applies, the term and the
201
+ fee. Where they conflict with this text, they prevail for the facts they state.
202
+
203
+ Where a licensee's procurement requires a signed order form, the licensee, the
204
+ licensed scope, the fee and any agreed support are recorded in one signed by
205
+ both parties, and that form and this text together are the agreement. Where they
206
+ conflict, the order form prevails.
207
+
208
+ The template is `docs/licensing/order-form.md`. It is a template and not an
209
+ agreement: an order form binds only once it is filled in and signed by both
210
+ parties.
211
+
212
+ Contact: sales@pdfluent.com
package/LICENSE-OFFER ADDED
@@ -0,0 +1,45 @@
1
+ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-PDFluent-Commercial
2
+
3
+ PDFluent is available under two licences, at your option
4
+ =======================================================
5
+
6
+ 1. The GNU Affero General Public License, version 3.
7
+
8
+ LICENSE the FSF text, verbatim
9
+
10
+ 2. The PDFluent Commercial Licence.
11
+
12
+ LICENSE-COMMERCIAL
13
+
14
+ Choose either. You do not need permission to choose the first.
15
+
16
+ The AGPL is the default. No key is required to receive it, nothing expires, and
17
+ the rights it grants are not conditional on anything we do. It asks something in
18
+ return: if you convey the software, or let users interact with a modified
19
+ version over a network, you must offer those users the corresponding source
20
+ under the same licence.
21
+
22
+ If that is impossible for you -- a closed surrounding product, a customer
23
+ contract, a legal department that will not accept copyleft in a shipped
24
+ binary -- the commercial licence is the alternative. Under it you are not buying
25
+ features. You are buying the right not to publish your own source. It is sold at
26
+ https://pdfluent.com/sdk/pricing; enquiries go to sales@pdfluent.com.
27
+
28
+
29
+ Why this file exists, and what it is not
30
+ ----------------------------------------
31
+
32
+ It is not a licence and it grants nothing. It is the statement of the offer, for
33
+ the two channels that cannot spell the offer in their own metadata.
34
+
35
+ npm rejects a LicenseRef expression outright -- measured with
36
+ validate-npm-package-license 3.0.4, the library npm itself uses -- and
37
+ nuget.org refuses one with NU5124. Both offer the same way out: point at a file.
38
+ Until 07-09-2026 that pointer resolved to LICENSE, because LICENSE then opened
39
+ with this same statement. Since then LICENSE holds the AGPL text and nothing
40
+ else, so that a licence scanner reading it sees the AGPL rather than prose it
41
+ cannot classify -- which is the whole point of that change, and it is why the
42
+ pointer needs a file of its own rather than a sentence bolted onto the licence.
43
+
44
+ The full explanation, with the history and what the build currently does, is the
45
+ Licence section of README.md.
package/NOTICE ADDED
@@ -0,0 +1,143 @@
1
+ PDFluent — Notice on License Composition
2
+
3
+ PDFluent is distributed across multiple Rust crates. Different crates within
4
+ the project carry different licenses depending on their origin and role.
5
+ Read this file together with the LICENSE file in the repository root.
6
+
7
+ ============================================================================
8
+ OPEN-SOURCE FOUNDATION (permissive upstream licences)
9
+ ============================================================================
10
+
11
+ The following crates are forks of upstream open-source libraries and remain
12
+ distributed under their original permissive licenses. They may be used
13
+ without a commercial license from PDFluent, subject only to the terms of
14
+ their respective open-source licenses:
15
+
16
+ pdfluent-lopdf MIT
17
+ (forked from lopdf, https://crates.io/crates/lopdf)
18
+
19
+ pdfluent-cff MIT OR Apache-2.0
20
+ (forked from cff-parser)
21
+
22
+ pdfluent-ccitt Apache-2.0 OR MIT
23
+ (forked from hayro-ccitt by Laurenz Stampfl,
24
+ https://github.com/LaurenzV/hayro)
25
+
26
+ pdfluent-jbig2 Apache-2.0 OR MIT
27
+ (forked from hayro-jbig2)
28
+
29
+ pdfluent-jpeg2000 Apache-2.0 OR MIT
30
+ (forked from hayro-jpeg2000)
31
+
32
+ pdf-syntax Apache-2.0 OR MIT
33
+ (forked from hayro-syntax)
34
+
35
+ pdf-interpret Apache-2.0 OR MIT
36
+ (forked from hayro-interpret)
37
+
38
+ pdf-render Apache-2.0 OR MIT
39
+ (substantially extended fork of hayro, co-authored by
40
+ Laurenz Stampfl)
41
+
42
+ pdf-font Apache-2.0 OR MIT
43
+ (substantially extended fork merging hayro-font,
44
+ hayro-cmap and hayro-postscript, co-authored by
45
+ Laurenz Stampfl; carries Adobe's CMap resources as
46
+ crates/pdf-font/assets/cmaps.brotli, © 1990-2023 Adobe,
47
+ BSD-3-Clause, with the licence text beside it as
48
+ crates/pdf-font/assets/LICENSE.txt)
49
+
50
+ pdf-render and pdf-font carry substantial PDFluent work on top of the upstream
51
+ code. That does not move them across the line: they are derivative works of an
52
+ Apache-2.0 OR MIT original whose relicensing is prohibited, so they stay
53
+ Apache-2.0 OR MIT here, however far they are extended.
54
+
55
+ The original copyright notices for these upstream projects are preserved
56
+ in their respective source files and in the THIRD_PARTY_LICENSES.txt file.
57
+
58
+ ============================================================================
59
+ DUAL-LICENSED COMPONENTS (AGPL-3.0-only OR PDFluent Commercial Licence)
60
+ ============================================================================
61
+
62
+ The following crates are PDFluent's own work and are available under two
63
+ licences, at your option: the GNU AGPLv3, or the PDFluent Commercial Licence.
64
+ See the LICENSE file in this repository.
65
+
66
+ The AGPL is the complete product; no feature is withheld and nothing expires.
67
+ It asks that you offer your users the corresponding source under the same
68
+ licence if you convey the software or let them use a modified version over a
69
+ network. The commercial licence is the alternative for anyone who cannot do
70
+ that. See https://pdfluent.com/sdk/pricing.
71
+
72
+ pdfluent — the unified facade SDK
73
+ pdf-engine — orchestration and document model
74
+ pdf-manip — page-level manipulation (merge, split, rotate, etc.)
75
+ (six unmodified Adobe CMap resources, compiled in
76
+ to read the character codes of a predefined CMap;
77
+ © 1990-2023 Adobe, BSD-3-Clause; that licence
78
+ ships inside the crate as
79
+ resources/cid-tables/LICENSE-Adobe-CMap.txt)
80
+ pdf-redact — content redaction
81
+ pdfluent-sign — digital signatures (PAdES, S/MIME)
82
+ pdf-compliance — PDF/A, PDF/UA, PDF/X validation and conversion
83
+ pdfluent-extract — text and image extraction
84
+ pdfluent-forms — AcroForm support
85
+ pdf-annot — annotations
86
+ pdf-docx — DOCX export
87
+ pdf-xlsx — XLSX export and table extraction
88
+ pdf-pptx — PowerPoint PPTX export
89
+ pdf-invoice — FDF/XFDF form data exchange and ZUGFeRD/Factur-X
90
+ pdf-text-format — text run formatting
91
+ pdf-standard-fonts — the Standard 14 font programs, compiled in
92
+ (the font programs themselves come from PDFium,
93
+ © 2014 Foxit Software Inc., BSD-3-Clause; that
94
+ notice ships inside the crate)
95
+ pdf-substitute-fonts — the substitute font programs, compiled in
96
+ (twelve unmodified Liberation 2.1.5 faces and two
97
+ unmodified Noto Naskh Arabic v2.021 faces, both SIL
98
+ Open Font License 1.1; those licences ship inside the
99
+ crate as LICENSE-Liberation.txt and
100
+ LICENSE-NotoNaskhArabic.txt. "Noto" is a trademark of
101
+ Google LLC, named as a fact about the bytes and not
102
+ as an endorsement)
103
+ pdf-ocr — OCR integration
104
+ pdf-xfa — XFA processing engine
105
+ xfa-dom-resolver — XFA DOM
106
+ xfa-layout-engine — XFA layout engine
107
+ xfa-js-sandboxed — sandboxed JavaScript runtime for XFA scripts
108
+ formcalc-interpreter — FormCalc evaluation
109
+ xfa-json — XFA JSON conversion
110
+
111
+ The Software produces the same output whether or not a commercial licence is
112
+ held: there is no licence key, nothing is withheld and no marker is added
113
+ (#226). Documents carry "PDFluent" in the PDF Producer entry and in XMP
114
+ metadata, which either licence lets you replace or remove in your own build.
115
+ See LICENSE-COMMERCIAL §4.
116
+
117
+ ============================================================================
118
+ EVALUATION
119
+ ============================================================================
120
+
121
+ Every crate above may be evaluated with nothing asked in return: no key, no
122
+ sign-up, no time limit. There is no separate evaluation build -- what you
123
+ install is the whole product, under the AGPLv3.
124
+
125
+ What an evaluation ends with is a choice of licence rather than an expiry:
126
+ the AGPL and its obligation to offer your users the corresponding source, or
127
+ the commercial licence, which removes that obligation. The commercial route
128
+ is self-service and yearly -- Commercial EUR 999 per organisation, OEM Startup
129
+ EUR 2,499 and OEM EUR 9,999 per product (LICENSE-COMMERCIAL §2a). Nothing is
130
+ delivered but an order confirmation and a licence document; there is no key.
131
+ Questions before buying: sales@pdfluent.com.
132
+
133
+ Licensing: https://pdfluent.com/docs/licensing
134
+ Pricing: https://pdfluent.com/sdk/pricing
135
+ Terms: https://pdfluent.com/terms
136
+
137
+ ============================================================================
138
+ CONTACT
139
+ ============================================================================
140
+
141
+ Innovation Trigger B.V. (operating as PDFluent)
142
+ hello@pdfluent.com
143
+ https://pdfluent.com
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # PDFluent browser SDK (WASM)
2
2
 
3
+ [Source on GitHub](https://github.com/pdfluent/pdfluent-sdk) · [Documentation](https://pdfluent.com/docs) · [Report an issue](https://github.com/pdfluent/pdfluent-sdk/issues)
4
+
3
5
  WebAssembly distribution of the PDFluent PDF engine. Read, edit, annotate,
4
6
  redact, sign, and validate PDFs (including XFA) entirely in the browser —
5
7
  zero bytes go to a server.
@@ -18,12 +20,11 @@ full SDK surface needed for an in-browser PDF editor. Previously known as
18
20
  - **Forms write-back**: set AcroForm field values, save modified PDF bytes
19
21
  - **Annotations** (feature `annotate`): highlight, sticky note, free text
20
22
  - **Text watermark**: diagonal text watermark with configurable opacity
21
- - **Redaction**: by region (rectangle) or by search query (GDPR-safe permanent removal)
23
+ - **Redaction**: by region (rectangle) or by search query (permanent removal: the content is gone, not covered)
22
24
  - **Stream compression**: re-deflate content streams for smaller file size
23
- - **License activation**: process-global tier activation via key string or file
24
- - **`PdfDocMut`** (Wave 3): stateful editing handle — open once, mutate in
25
- place, save once. 2.7× faster than the stateless `PdfDoc` chain for
26
- multi-step edits, identical output bytes.
25
+ - **`PdfDocMut`**: stateful editing handle — open once, mutate in place,
26
+ save once. One parse and one serialise for a whole editing session instead
27
+ of one per operation, with identical output bytes.
27
28
 
28
29
  ## Building
29
30
 
@@ -169,38 +170,6 @@ wasm-pack build crates/xfa-wasm --target web -- --no-default-features
169
170
  | `nodeCount()` | Number of form nodes |
170
171
  | `version()` | Engine version string |
171
172
 
172
- ### License Activation
173
-
174
- The WASM build runs in Trial mode by default. Output produced by the engine
175
- is marked via `/Producer` metadata in Trial. Activate a license to remove
176
- the mark and unlock paid capabilities.
177
-
178
- ```js
179
- import init, { activateLicenseKey, licenseStatus } from '@pdfluent/sdk-wasm';
180
-
181
- await init();
182
- activateLicenseKey('tier:enterprise');
183
-
184
- const s = licenseStatus();
185
- console.log(s.tier); // "Enterprise"
186
- console.log(s.source); // "Explicit" | "EnvVar" | "Default"
187
- console.log(s.outputIsMarked); // false
188
- ```
189
-
190
- **Browser-specific caveats:**
191
-
192
- - `activateLicenseFile` is intentionally **not** exposed. Browsers and
193
- Workers have no synchronous filesystem access. Fetch the key text
194
- yourself (`await fetch(...).then(r => r.text())`) and pass it to
195
- `activateLicenseKey`.
196
- - The `PDFLUENT_LICENSE_KEY` environment variable is honoured only when a
197
- Node host provides it; browsers do not expose process env vars.
198
- - The active tier is **process-global and set-once** within a single WASM
199
- instance. Activating a second time with a different tier throws; reload
200
- the page or re-initialise the WASM module to switch tiers.
201
-
202
- Invalid keys throw `Error`. The key string is never logged.
203
-
204
173
  ### PdfDoc
205
174
 
206
175
  | Method | Description |
@@ -224,7 +193,7 @@ Invalid keys throw `Error`. The key string is never logged.
224
193
  | `flattenXfa()` | Flatten XFA form fields into static PDF content |
225
194
  | `convertToPdfa(level)` | Convert to PDF/A 1b/2b/3b, returns bytes |
226
195
 
227
- ### Page manipulation (Wave 2)
196
+ ### Page manipulation
228
197
 
229
198
  | Method | Description |
230
199
  |--------|-------------|
@@ -233,28 +202,28 @@ Invalid keys throw `Error`. The key string is never logged.
233
202
  | `reorderPages(newOrder: Uint32Array)` | Permute pages; returns new bytes |
234
203
  | `extractPages(pages: Uint32Array)` | Extract the listed pages into a new PDF (use for split) |
235
204
 
236
- ### Edit, annotate, redact, optimise (Wave 2)
205
+ ### Edit, annotate, redact, optimise
237
206
 
238
207
  | Method | Description |
239
208
  |--------|-------------|
240
- | `setFormField(path, value)` | Set a single AcroForm text field; returns new bytes |
241
- | `setFormFields(jsonObject)` | Bulk-set form fields from a JSON `{path: value}` map |
209
+ | `setFormField(path, value)` | Fill a single AcroForm **text** field; updates `/V`, `/AS`, and `/AP`; returns new bytes. For checkbox/radio/choice use `PdfDocMut`. |
210
+ | `setFormFields(jsonObject)` | Bulk-fill **text** fields from a JSON `{path: value}` map; returns new bytes |
242
211
  | `addHighlight(pageIndex, x, y, w, h, colorHex?)` | Highlight annotation (feature: annotate) |
243
212
  | `addStickyNote(pageIndex, x, y, contents)` | Sticky note annotation (feature: annotate) |
244
213
  | `addFreeText(pageIndex, x, y, w, h, contents)` | Free-text annotation (feature: annotate) |
245
214
  | `addTextWatermark(text, opacity)` | Diagonal text watermark on all pages |
246
- | `redactRegion(pageIndex, x, y, w, h)` | Permanently remove content in a rectangle (GDPR-safe) |
215
+ | `redactRegion(pageIndex, x, y, w, h)` | Permanently remove content in a rectangle |
247
216
  | `redactSearch(query)` | Find all literal matches of `query` and redact each |
248
217
  | `compress()` | Re-deflate content streams; returns optimised bytes |
249
218
 
250
- ### PdfDocMut (Wave 3) — **recommended for editor workflows**
219
+ ### PdfDocMut — **recommended for editor workflows**
251
220
 
252
221
  `PdfDocMut` is a stateful editing handle. Open once, mutate in place,
253
222
  save once. The `PdfDoc` class above is great for inspection and
254
223
  single-shot transformations, but for an editor that applies multiple
255
- operations to the same document, **`PdfDocMut` is dramatically faster**:
256
- 9-step sessions go from ~16 parse passes to **1 parse + 1 serialise**
257
- (measured 2.7× wall-clock speedup; bigger on larger documents).
224
+ operations to the same document, `PdfDocMut` does the work once: a session
225
+ of many steps is **one parse and one serialise** instead of a parse and a
226
+ serialise per step.
258
227
 
259
228
  | Method | Description |
260
229
  |--------|-------------|
@@ -266,13 +235,13 @@ operations to the same document, **`PdfDocMut` is dramatically faster**:
266
235
  | `rotatePage(pageIndex, degrees)` | In place |
267
236
  | `reorderPages(newOrder)` | In place |
268
237
  | `extractPages(pages)` | Returns bytes for a NEW subdocument; current editor unchanged |
269
- | `setFormField(path, value)` | In place |
270
- | `setFormFields(jsonObject)` | In place, bulk |
238
+ | `setFormField(path, value)` | In place — text, checkbox, radio, and choice; updates `/V`, `/AS`, and `/AP` |
239
+ | `setFormFields(jsonObject)` | In place, bulk — same full chain for each entry |
271
240
  | `addHighlight(pageIndex, x, y, w, h, colorHex?)` | In place (feature: annotate) |
272
241
  | `addStickyNote(pageIndex, x, y, contents)` | In place (feature: annotate) |
273
242
  | `addFreeText(pageIndex, x, y, w, h, contents)` | In place (feature: annotate) |
274
243
  | `addTextWatermark(text, opacity)` | In place |
275
- | `redactRegion(pageIndex, x, y, w, h)` | In place (GDPR-safe permanent removal) |
244
+ | `redactRegion(pageIndex, x, y, w, h)` | In place (permanent removal: the content is gone, not covered) |
276
245
  | `redactSearch(query)` | In place |
277
246
  | `compress()` | In place |
278
247
 
@@ -311,12 +280,19 @@ const doc = PdfDoc.open(bytes);
311
280
  const merged = doc.merge(otherBytes); // single op, one-shot
312
281
  ```
313
282
 
314
- ## Bundle size
283
+ ## Licence
284
+
285
+ AGPL-3.0 or a commercial licence, at your option. The AGPL is the default and
286
+ the complete product: there is no licence key, no activation call and no tier,
287
+ and every feature works in every build. If you cannot accept the copyleft
288
+ obligation, the commercial licence is sold yearly and self-service at
289
+ [pdfluent.com/sdk/pricing](https://pdfluent.com/sdk/pricing), in four options: Commercial (per
290
+ organisation), OEM Startup and OEM (per product), and Priority support (an
291
+ add-on). The two texts are `LICENSE` and `LICENSE-COMMERCIAL` in this package.
315
292
 
316
- | Build | Tarball | Unpacked |
317
- |-------|---------|----------|
318
- | 1.0.0-beta.8 (pre-Wave 2) | 3.6 MB | 10.2 MB |
319
- | **1.0.0-beta.9 (Wave 2)** | **3.8 MB** | **~11 MB** |
293
+ ## Links
320
294
 
321
- Wave 2 added 13 new methods for ~0.2 MB of binary growth. Well under the
322
- 15 MB hard limit and well under the 5 MB gzipped soft target.
295
+ - **Documentation:** <https://pdfluent.com/docs>
296
+ - **Pricing:** <https://pdfluent.com/sdk/pricing>
297
+ - **PDFluent editor** (source-available): <https://github.com/pdfluent/pdfluent>. The free desktop app this SDK powers.
298
+ - Built by [Innovation Trigger BV](https://pdfluent.com)