@adnsistemas/pdf-lib 2.6.4 → 2.7.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.
Files changed (61) hide show
  1. package/README.md +44 -0
  2. package/cjs/api/PDFDocument.d.ts +22 -0
  3. package/cjs/api/PDFDocument.d.ts.map +1 -1
  4. package/cjs/api/PDFDocument.js +45 -0
  5. package/cjs/api/PDFDocument.js.map +1 -1
  6. package/cjs/api/PDFFont.d.ts +1 -1
  7. package/cjs/api/PDFFont.d.ts.map +1 -1
  8. package/cjs/api/PDFFont.js +3 -5
  9. package/cjs/api/PDFFont.js.map +1 -1
  10. package/cjs/core/PDFContext.d.ts +2 -0
  11. package/cjs/core/PDFContext.d.ts.map +1 -1
  12. package/cjs/core/PDFContext.js +43 -2
  13. package/cjs/core/PDFContext.js.map +1 -1
  14. package/cjs/core/objects/PDFArray.d.ts +1 -0
  15. package/cjs/core/objects/PDFArray.d.ts.map +1 -1
  16. package/cjs/core/objects/PDFArray.js +7 -0
  17. package/cjs/core/objects/PDFArray.js.map +1 -1
  18. package/cjs/core/objects/PDFRawStream.d.ts.map +1 -1
  19. package/cjs/core/objects/PDFRawStream.js +1 -0
  20. package/cjs/core/objects/PDFRawStream.js.map +1 -1
  21. package/dist/pdf-lib.esm.js +99 -7
  22. package/dist/pdf-lib.esm.js.map +1 -1
  23. package/dist/pdf-lib.esm.min.js +2 -2
  24. package/dist/pdf-lib.esm.min.js.map +1 -1
  25. package/dist/pdf-lib.js +99 -7
  26. package/dist/pdf-lib.js.map +1 -1
  27. package/dist/pdf-lib.min.js +2 -2
  28. package/dist/pdf-lib.min.js.map +1 -1
  29. package/es/api/PDFDocument.d.ts +22 -0
  30. package/es/api/PDFDocument.d.ts.map +1 -1
  31. package/es/api/PDFDocument.js +45 -0
  32. package/es/api/PDFDocument.js.map +1 -1
  33. package/es/api/PDFFont.d.ts +1 -1
  34. package/es/api/PDFFont.d.ts.map +1 -1
  35. package/es/api/PDFFont.js +3 -5
  36. package/es/api/PDFFont.js.map +1 -1
  37. package/es/core/PDFContext.d.ts +2 -0
  38. package/es/core/PDFContext.d.ts.map +1 -1
  39. package/es/core/PDFContext.js +43 -2
  40. package/es/core/PDFContext.js.map +1 -1
  41. package/es/core/objects/PDFArray.d.ts +1 -0
  42. package/es/core/objects/PDFArray.d.ts.map +1 -1
  43. package/es/core/objects/PDFArray.js +7 -0
  44. package/es/core/objects/PDFArray.js.map +1 -1
  45. package/es/core/objects/PDFRawStream.d.ts.map +1 -1
  46. package/es/core/objects/PDFRawStream.js +1 -0
  47. package/es/core/objects/PDFRawStream.js.map +1 -1
  48. package/package.json +3 -2
  49. package/src/api/PDFDocument.ts +60 -0
  50. package/src/api/PDFFont.ts +3 -5
  51. package/src/core/PDFContext.ts +42 -1
  52. package/src/core/objects/PDFArray.ts +8 -0
  53. package/src/core/objects/PDFRawStream.ts +1 -0
  54. package/ts3.4/cjs/api/PDFDocument.d.ts +22 -0
  55. package/ts3.4/cjs/api/PDFFont.d.ts +1 -1
  56. package/ts3.4/cjs/core/PDFContext.d.ts +2 -0
  57. package/ts3.4/cjs/core/objects/PDFArray.d.ts +1 -0
  58. package/ts3.4/es/api/PDFDocument.d.ts +22 -0
  59. package/ts3.4/es/api/PDFFont.d.ts +1 -1
  60. package/ts3.4/es/core/PDFContext.d.ts +2 -0
  61. package/ts3.4/es/core/objects/PDFArray.d.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"PDFRawStream.d.ts","sourceRoot":"","sources":["../../../src/core/objects/PDFRawStream.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,UAAU,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,cAAM,YAAa,SAAQ,SAAS;IAClC,MAAM,CAAC,EAAE,SACD,OAAO,YACH,UAAU,cACR,eAAe,kBACoB;IAEjD,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;IAErC,OAAO;IAUP,YAAY,IAAI,UAAU;IAI1B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,YAAY;IAIzC,iBAAiB,IAAI,MAAM;IAI3B,WAAW,IAAI,UAAU;IAIzB,eAAe,IAAI,MAAM;IAIzB,cAAc,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI;CAG3C;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"PDFRawStream.d.ts","sourceRoot":"","sources":["../../../src/core/objects/PDFRawStream.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,UAAU,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,cAAM,YAAa,SAAQ,SAAS;IAClC,MAAM,CAAC,EAAE,SACD,OAAO,YACH,UAAU,cACR,eAAe,kBACoB;IAEjD,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;IAErC,OAAO;IAUP,YAAY,IAAI,UAAU;IAI1B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,YAAY;IAIzC,iBAAiB,IAAI,MAAM;IAI3B,WAAW,IAAI,UAAU;IAIzB,eAAe,IAAI,MAAM;IAIzB,cAAc,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI;CAI3C;AAED,eAAe,YAAY,CAAC"}
@@ -25,6 +25,7 @@ class PDFRawStream extends PDFStream_1.default {
25
25
  return this.contents.length;
26
26
  }
27
27
  updateContents(contents) {
28
+ this.dict.registerChange();
28
29
  this.contents = contents;
29
30
  }
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PDFRawStream.js","sourceRoot":"","sources":["../../../src/core/objects/PDFRawStream.ts"],"names":[],"mappings":";;;AACA,oEAAoC;AAEpC,uCAA4C;AAG5C,MAAM,YAAa,SAAQ,mBAAS;IAUlC,YACE,IAAa,EACb,QAAoB,EACpB,SAA2B;QAE3B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAoB;QACxB,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,iBAAiB;QACf,OAAO,IAAA,qBAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,QAAoB;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;;AAzCM,eAAE,GAAG,CACV,IAAa,EACb,QAAoB,EACpB,SAA2B,EAC3B,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAwCnD,kBAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"PDFRawStream.js","sourceRoot":"","sources":["../../../src/core/objects/PDFRawStream.ts"],"names":[],"mappings":";;;AACA,oEAAoC;AAEpC,uCAA4C;AAG5C,MAAM,YAAa,SAAQ,mBAAS;IAUlC,YACE,IAAa,EACb,QAAoB,EACpB,SAA2B;QAE3B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAoB;QACxB,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,iBAAiB;QACf,OAAO,IAAA,qBAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,QAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;;AA1CM,eAAE,GAAG,CACV,IAAa,EACb,QAAoB,EACpB,SAA2B,EAC3B,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAyCnD,kBAAe,YAAY,CAAC"}
@@ -8335,9 +8335,11 @@ class PDFArray extends PDFObject {
8335
8335
  return this.array.length;
8336
8336
  }
8337
8337
  push(object) {
8338
+ this.registerChange();
8338
8339
  this.array.push(object);
8339
8340
  }
8340
8341
  insert(index, object) {
8342
+ this.registerChange();
8341
8343
  this.array.splice(index, 0, object);
8342
8344
  }
8343
8345
  indexOf(object) {
@@ -8345,9 +8347,11 @@ class PDFArray extends PDFObject {
8345
8347
  return index === -1 ? undefined : index;
8346
8348
  }
8347
8349
  remove(index) {
8350
+ this.registerChange();
8348
8351
  this.array.splice(index, 1);
8349
8352
  }
8350
8353
  set(idx, object) {
8354
+ this.registerChange();
8351
8355
  this.array[idx] = object;
8352
8356
  }
8353
8357
  get(index) {
@@ -8422,6 +8426,9 @@ class PDFArray extends PDFObject {
8422
8426
  }
8423
8427
  }
8424
8428
  }
8429
+ registerChange() {
8430
+ this.context.registerObjectChange(this);
8431
+ }
8425
8432
  }
8426
8433
  PDFArray.withContext = (context) => new PDFArray(context);
8427
8434
 
@@ -8911,6 +8918,7 @@ class PDFRawStream extends PDFStream {
8911
8918
  return this.contents.length;
8912
8919
  }
8913
8920
  updateContents(contents) {
8921
+ this.dict.registerChange();
8914
8922
  this.contents = contents;
8915
8923
  }
8916
8924
  }
@@ -9527,8 +9535,49 @@ class PDFContext {
9527
9535
  return `${prefix}-${Math.floor(this.rng.nextInt() * Math.pow(10, suffixLength))}`;
9528
9536
  }
9529
9537
  registerObjectChange(obj) {
9530
- if (this.snapshot)
9531
- this.snapshot.markObjForSave(obj);
9538
+ if (!this.snapshot)
9539
+ return;
9540
+ const ref = this.getObjectRef(obj);
9541
+ if (ref) {
9542
+ this.snapshot.markRefForSave(ref);
9543
+ return;
9544
+ }
9545
+ const containingRef = this.findContainingIndirectObject(obj);
9546
+ if (containingRef) {
9547
+ this.snapshot.markRefForSave(containingRef);
9548
+ }
9549
+ }
9550
+ findContainingIndirectObject(target) {
9551
+ const entries = Array.from(this.indirectObjects.entries());
9552
+ for (let idx = 0, len = entries.length; idx < len; idx++) {
9553
+ const [ref, object] = entries[idx];
9554
+ if (this.objectContains(object, target)) {
9555
+ return ref;
9556
+ }
9557
+ }
9558
+ return undefined;
9559
+ }
9560
+ objectContains(container, target) {
9561
+ if (container === target)
9562
+ return true;
9563
+ if (container instanceof PDFDict) {
9564
+ const values = container.values();
9565
+ for (let i = 0, len = values.length; i < len; i++) {
9566
+ if (this.objectContains(values[i], target))
9567
+ return true;
9568
+ }
9569
+ }
9570
+ else if (container instanceof PDFArray) {
9571
+ for (let i = 0, len = container.size(); i < len; i++) {
9572
+ if (this.objectContains(container.get(i), target))
9573
+ return true;
9574
+ }
9575
+ }
9576
+ else if (container instanceof PDFStream) {
9577
+ if (this.objectContains(container.dict, target))
9578
+ return true;
9579
+ }
9580
+ return false;
9532
9581
  }
9533
9582
  getObjectVersions(ref) {
9534
9583
  if (!this.preserveObjectsVersions)
@@ -30164,7 +30213,7 @@ PDFEmbeddedPage.of = (ref, doc, embedder) => new PDFEmbeddedPage(ref, doc, embed
30164
30213
  */
30165
30214
  class PDFFont {
30166
30215
  constructor(ref, doc, embedder) {
30167
- this.modified = true;
30216
+ this.alreadyEmbedded = false;
30168
30217
  assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]);
30169
30218
  assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]);
30170
30219
  assertIs(embedder, 'embedder', [
@@ -30188,7 +30237,6 @@ class PDFFont {
30188
30237
  */
30189
30238
  encodeText(text) {
30190
30239
  assertIs(text, 'text', ['string']);
30191
- this.modified = true;
30192
30240
  return this.embedder.encodeText(text);
30193
30241
  }
30194
30242
  /**
@@ -30263,10 +30311,9 @@ class PDFFont {
30263
30311
  */
30264
30312
  embed() {
30265
30313
  return __awaiter(this, void 0, void 0, function* () {
30266
- // TODO: Cleanup orphan embedded objects if a font is embedded multiple times...
30267
- if (this.modified) {
30314
+ if (!this.alreadyEmbedded) {
30268
30315
  yield this.embedder.embedIntoContext(this.doc.context, this.ref);
30269
- this.modified = false;
30316
+ this.alreadyEmbedded = true;
30270
30317
  }
30271
30318
  });
30272
30319
  }
@@ -37188,6 +37235,51 @@ class PDFDocument {
37188
37235
  .map((value) => value[1])
37189
37236
  .filter((ov) => ov.actual || ov.previous.length);
37190
37237
  }
37238
+ /**
37239
+ * Saves the current changes to the document as an incremental update, returns the full document,
37240
+ * like save method, and modifies the internal state to be able to continue editing the document
37241
+ * for another incremental update.
37242
+ * This allows you to save multiple incremental updates without reloading the PDF.
37243
+ *
37244
+ * For example:
37245
+ * ```js
37246
+ * const pdfDoc = await PDFDocument.load(pdfBytes, { forIncrementalUpdate: true })
37247
+ *
37248
+ * const page = pdfDoc.getPage(0)
37249
+ * page.drawText('First update')
37250
+ * const firstsave = await pdfDoc.saveAndContinue()
37251
+ *
37252
+ * page.drawText('Second update', { y: 100 })
37253
+ * const secondsave = await pdfDoc.saveAndContinue()
37254
+ * ```
37255
+ *
37256
+ * @param options The options to be used when saving changes.
37257
+ * @returns Resolves with the complete PDF bytes including all updates.
37258
+ */
37259
+ saveAndContinue(options = {}) {
37260
+ return __awaiter(this, void 0, void 0, function* () {
37261
+ if (!this.context.pdfFileDetails.originalBytes || !this.context.snapshot) {
37262
+ throw new Error('saveAndContinue() requires the document to be loaded with forIncrementalUpdate: true');
37263
+ }
37264
+ const originalBytes = this.context.pdfFileDetails.originalBytes;
37265
+ const incrementalBytes = yield this.saveIncremental(this.context.snapshot, options);
37266
+ const newPdfBytes = new Uint8Array(originalBytes.byteLength + incrementalBytes.byteLength);
37267
+ newPdfBytes.set(originalBytes);
37268
+ newPdfBytes.set(incrementalBytes, originalBytes.byteLength);
37269
+ this.context.pdfFileDetails.originalBytes = newPdfBytes;
37270
+ this.context.pdfFileDetails.pdfSize = newPdfBytes.byteLength;
37271
+ const incrementalStr = new TextDecoder('latin1').decode(incrementalBytes);
37272
+ const startxrefMatch = incrementalStr.match(/startxref\s+(\d+)/);
37273
+ if (startxrefMatch) {
37274
+ this.context.pdfFileDetails.prevStartXRef = parseInt(startxrefMatch[1], 10);
37275
+ }
37276
+ else {
37277
+ this.context.pdfFileDetails.prevStartXRef = originalBytes.byteLength;
37278
+ }
37279
+ this.context.snapshot = this.takeSnapshot();
37280
+ return newPdfBytes;
37281
+ });
37282
+ }
37191
37283
  prepareForSave(options) {
37192
37284
  return __awaiter(this, void 0, void 0, function* () {
37193
37285
  const { addDefaultPage = true, updateFieldAppearances = true } = options;