@adnsistemas/pdf-lib 2.7.3 → 2.8.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 (58) hide show
  1. package/README.md +1 -0
  2. package/cjs/api/PDFDocument.d.ts +16 -2
  3. package/cjs/api/PDFDocument.d.ts.map +1 -1
  4. package/cjs/api/PDFDocument.js +58 -4
  5. package/cjs/api/PDFDocument.js.map +1 -1
  6. package/cjs/api/PDFEmbeddedFile.d.ts +6 -0
  7. package/cjs/api/PDFEmbeddedFile.d.ts.map +1 -1
  8. package/cjs/api/PDFEmbeddedFile.js +10 -0
  9. package/cjs/api/PDFEmbeddedFile.js.map +1 -1
  10. package/cjs/api/PDFPage.js +1 -1
  11. package/cjs/api/operations.js +2 -2
  12. package/cjs/api/operations.js.map +1 -1
  13. package/cjs/core/embedders/JpegEmbedder.d.ts.map +1 -1
  14. package/cjs/core/embedders/JpegEmbedder.js +1 -1
  15. package/cjs/core/embedders/JpegEmbedder.js.map +1 -1
  16. package/cjs/core/structures/PDFCatalog.d.ts +3 -0
  17. package/cjs/core/structures/PDFCatalog.d.ts.map +1 -1
  18. package/cjs/core/structures/PDFCatalog.js +7 -0
  19. package/cjs/core/structures/PDFCatalog.js.map +1 -1
  20. package/dist/pdf-lib.esm.js +78 -8
  21. package/dist/pdf-lib.esm.js.map +1 -1
  22. package/dist/pdf-lib.esm.min.js +2 -2
  23. package/dist/pdf-lib.esm.min.js.map +1 -1
  24. package/dist/pdf-lib.js +78 -8
  25. package/dist/pdf-lib.js.map +1 -1
  26. package/dist/pdf-lib.min.js +2 -2
  27. package/dist/pdf-lib.min.js.map +1 -1
  28. package/es/api/PDFDocument.d.ts +16 -2
  29. package/es/api/PDFDocument.d.ts.map +1 -1
  30. package/es/api/PDFDocument.js +58 -4
  31. package/es/api/PDFDocument.js.map +1 -1
  32. package/es/api/PDFEmbeddedFile.d.ts +6 -0
  33. package/es/api/PDFEmbeddedFile.d.ts.map +1 -1
  34. package/es/api/PDFEmbeddedFile.js +10 -0
  35. package/es/api/PDFEmbeddedFile.js.map +1 -1
  36. package/es/api/PDFPage.js +1 -1
  37. package/es/api/operations.js +2 -2
  38. package/es/api/operations.js.map +1 -1
  39. package/es/core/embedders/JpegEmbedder.d.ts.map +1 -1
  40. package/es/core/embedders/JpegEmbedder.js +1 -1
  41. package/es/core/embedders/JpegEmbedder.js.map +1 -1
  42. package/es/core/structures/PDFCatalog.d.ts +3 -0
  43. package/es/core/structures/PDFCatalog.d.ts.map +1 -1
  44. package/es/core/structures/PDFCatalog.js +7 -0
  45. package/es/core/structures/PDFCatalog.js.map +1 -1
  46. package/package.json +4 -2
  47. package/src/api/PDFDocument.ts +74 -9
  48. package/src/api/PDFEmbeddedFile.ts +12 -0
  49. package/src/api/PDFPage.ts +1 -1
  50. package/src/api/operations.ts +2 -2
  51. package/src/core/embedders/JpegEmbedder.ts +5 -1
  52. package/src/core/structures/PDFCatalog.ts +9 -0
  53. package/ts3.4/cjs/api/PDFDocument.d.ts +16 -2
  54. package/ts3.4/cjs/api/PDFEmbeddedFile.d.ts +6 -0
  55. package/ts3.4/cjs/core/structures/PDFCatalog.d.ts +3 -0
  56. package/ts3.4/es/api/PDFDocument.d.ts +16 -2
  57. package/ts3.4/es/api/PDFEmbeddedFile.d.ts +6 -0
  58. package/ts3.4/es/core/structures/PDFCatalog.d.ts +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"PDFCatalog.js","sourceRoot":"","sources":["../../../src/core/structures/PDFCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,OAAoB,MAAM,oBAAoB,CAAC;AACtD,OAAO,OAAO,MAAM,oBAAoB,CAAC;AAIzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AAEjE,MAAM,UAAW,SAAQ,OAAO;IAc9B,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAgB,CAAC;IAClE,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,mBAAmB;QACjB,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;SAC/C;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,oBAAoB;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,4BAA4B;QAC1B,IAAI,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,EAAE;YAChB,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,cAAc,CAAC,CAAC;SAC3D;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CAAC,OAAe,EAAE,KAAa;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAW,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,cAAc,IAAI,QAAQ,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;;AAxEM,8BAAmB,GAAG,CAC3B,OAAmB,EACnB,KAA2B,EAC3B,EAAE;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEK,6BAAkB,GAAG,CAAC,GAAY,EAAE,OAAmB,EAAE,EAAE,CAChE,IAAI,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAgEjC,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"PDFCatalog.js","sourceRoot":"","sources":["../../../src/core/structures/PDFCatalog.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adnsistemas/pdf-lib",
3
- "version": "2.7.3",
3
+ "version": "2.8.0",
4
4
  "description": "Create and modify PDF files with JavaScript",
5
5
  "author": "Andrew Dillon <andrew.dillon.j@gmail.com>",
6
6
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
@@ -43,7 +43,9 @@
43
43
  "Donald Ness (https://github.com/programmarchy)",
44
44
  "Remus DRAICA (https://github.com/remdra)",
45
45
  "David Abdala (https://github.com/adnsistemas)",
46
- "Eran Ohayon (https://github.com/erano067)"
46
+ "Eran Ohayon (https://github.com/erano067)",
47
+ "Shaun Verch (https://github.com/sverch)",
48
+ "Guido Flohr (https://github.com/gflohr)"
47
49
  ],
48
50
  "scripts": {
49
51
  "release": "yarn release:prep && release-it",
@@ -82,7 +82,7 @@ import PDFSecurity, { SecurityOptions } from '../core/security/PDFSecurity';
82
82
  import { IncrementalDocumentSnapshot } from './snapshot';
83
83
  import type { DocumentSnapshot } from './snapshot';
84
84
 
85
- export type PDFAttachment = {
85
+ export type BasePDFAttachment = {
86
86
  name: string;
87
87
  data: Uint8Array;
88
88
  mimeType: string | undefined;
@@ -92,6 +92,17 @@ export type PDFAttachment = {
92
92
  modificationDate: Date | undefined;
93
93
  };
94
94
 
95
+ export type SavedPDFAttachment = BasePDFAttachment & {
96
+ embeddedFileDict: PDFDict;
97
+ specRef: PDFRef;
98
+ };
99
+
100
+ export type UnsavedPDFAttachment = BasePDFAttachment & {
101
+ pdfEmbeddedFile: PDFEmbeddedFile;
102
+ };
103
+
104
+ export type PDFAttachment = UnsavedPDFAttachment | SavedPDFAttachment;
105
+
95
106
  export type PDFObjectVersions = {
96
107
  ref: PDFRef;
97
108
  actual: PDFObject | undefined;
@@ -1011,15 +1022,19 @@ export default class PDFDocument {
1011
1022
  for (let idx = 0, len = EFNames.size(); idx < len; idx += 2) {
1012
1023
  const fileName = EFNames.lookup(idx) as PDFHexString | PDFString;
1013
1024
  const fileSpec = EFNames.lookup(idx + 1, PDFDict);
1014
- rawAttachments.push({ fileName, fileSpec });
1025
+ rawAttachments.push({
1026
+ fileName,
1027
+ fileSpec,
1028
+ specRef: EFNames.get(idx + 1) as PDFRef,
1029
+ });
1015
1030
  }
1016
1031
 
1017
1032
  return rawAttachments;
1018
1033
  }
1019
1034
 
1020
- private getSavedAttachments(): PDFAttachment[] {
1035
+ private getSavedAttachments(): SavedPDFAttachment[] {
1021
1036
  const rawAttachments = this.getRawAttachments();
1022
- return rawAttachments.flatMap(({ fileName, fileSpec }) => {
1037
+ return rawAttachments.flatMap(({ fileName, fileSpec, specRef }) => {
1023
1038
  const efDict = fileSpec.lookup(PDFName.of('EF'));
1024
1039
  if (!(efDict instanceof PDFDict)) return [];
1025
1040
 
@@ -1062,9 +1077,12 @@ export default class PDFDocument {
1062
1077
  }
1063
1078
  }
1064
1079
 
1065
- const description = (
1066
- fileSpec.lookup(PDFName.of('Desc')) as PDFHexString
1067
- ).decodeText();
1080
+ const descRaw = fileSpec.lookup(PDFName.of('Desc'));
1081
+ let description: string | undefined;
1082
+
1083
+ if (descRaw instanceof PDFHexString) {
1084
+ description = descRaw.decodeText();
1085
+ }
1068
1086
 
1069
1087
  return [
1070
1088
  {
@@ -1077,13 +1095,16 @@ export default class PDFDocument {
1077
1095
  description,
1078
1096
  creationDate,
1079
1097
  modificationDate,
1098
+ embeddedFileDict: efDict,
1099
+ specRef,
1080
1100
  },
1081
1101
  ];
1082
1102
  });
1083
1103
  }
1084
1104
 
1085
- private getUnsavedAttachments(): PDFAttachment[] {
1086
- const attachments = this.embeddedFiles.map((file) => {
1105
+ private getUnsavedAttachments(): UnsavedPDFAttachment[] {
1106
+ const attachments = this.embeddedFiles.flatMap((file) => {
1107
+ if (file.getAlreadyEmbedded()) return [];
1087
1108
  const embedder = file.getEmbedder();
1088
1109
 
1089
1110
  return {
@@ -1094,6 +1115,7 @@ export default class PDFDocument {
1094
1115
  afRelationship: embedder.options.afRelationship,
1095
1116
  creationDate: embedder.options.creationDate,
1096
1117
  modificationDate: embedder.options.modificationDate,
1118
+ pdfEmbeddedFile: file,
1097
1119
  };
1098
1120
  });
1099
1121
 
@@ -1112,6 +1134,49 @@ export default class PDFDocument {
1112
1134
  return [...savedAttachments, ...unsavedAttachments];
1113
1135
  }
1114
1136
 
1137
+ /**
1138
+ * Removes an attachment from PDF, based on name.
1139
+ * @param {string} name Name of the attachmet to remove.
1140
+ */
1141
+ detach(name: string) {
1142
+ const attachedFiles = this.getAttachments();
1143
+ attachedFiles.forEach((file) => {
1144
+ if (file.name !== name) return;
1145
+ // the file wasn't embedded into context yet
1146
+ if ('pdfEmbeddedFile' in file) {
1147
+ const i = this.embeddedFiles.findIndex(
1148
+ (f) => file.pdfEmbeddedFile === f,
1149
+ );
1150
+ if (i !== undefined) this.embeddedFiles.splice(i, 1);
1151
+ } else {
1152
+ // remove references from catalog
1153
+ const namesArr = this.catalog
1154
+ .Names()
1155
+ ?.lookup(PDFName.of('EmbeddedFiles'), PDFDict)
1156
+ .lookup(PDFName.of('Names'), PDFArray);
1157
+ const iNames = namesArr?.indexOf(file.specRef);
1158
+ if (iNames !== undefined && iNames > 0) {
1159
+ // attachment spec ref
1160
+ namesArr?.remove(iNames);
1161
+ // attachment name
1162
+ namesArr?.remove(iNames - 1);
1163
+ }
1164
+ // AF-Tag for PDF-A3 compliance
1165
+ const AF = this.catalog.AttachedFiles();
1166
+ const afIndex = AF?.indexOf(file.specRef);
1167
+ if (afIndex !== undefined) AF?.remove(afIndex);
1168
+
1169
+ // remove references from context
1170
+ const streamRef = this.context
1171
+ .lookupMaybe(file.specRef, PDFDict)
1172
+ ?.lookupMaybe(PDFName.of('EF'), PDFDict)
1173
+ ?.get(PDFName.of('F')) as PDFRef | undefined;
1174
+ if (streamRef) this.context.delete(streamRef);
1175
+ this.context.delete(file.specRef);
1176
+ }
1177
+ });
1178
+ }
1179
+
1115
1180
  /**
1116
1181
  * Embed a font into this document. The input data can be provided in multiple
1117
1182
  * formats:
@@ -95,4 +95,16 @@ export default class PDFEmbeddedFile implements Embeddable {
95
95
  getEmbedder() {
96
96
  return this.embedder;
97
97
  }
98
+
99
+ /**
100
+ * Returns whether or not this file has already been embedded.
101
+ * @returns true if the file has already been embedded, false otherwise.
102
+ */
103
+ getAlreadyEmbedded() {
104
+ return this.alreadyEmbedded;
105
+ }
106
+
107
+ getRef() {
108
+ return this.ref;
109
+ }
98
110
  }
@@ -1275,7 +1275,7 @@ export default class PDFPage {
1275
1275
  rotate: options.rotate ?? degrees(0),
1276
1276
  color: options.color ?? undefined,
1277
1277
  borderColor: options.borderColor ?? undefined,
1278
- borderWidth: options.borderWidth ?? 0,
1278
+ borderWidth: options.borderWidth ?? 1,
1279
1279
  borderDashArray: options.borderDashArray ?? undefined,
1280
1280
  borderDashPhase: options.borderDashPhase ?? undefined,
1281
1281
  borderLineCap: options.borderLineCap ?? undefined,
@@ -845,11 +845,11 @@ const getDrawingOperator = ({
845
845
  borderColor?: Color;
846
846
  fillRule?: FillRule;
847
847
  }) => {
848
- if (color && borderColor && borderWidth) {
848
+ if (color && borderColor && borderWidth !== 0) {
849
849
  return fillAndStroke;
850
850
  } else if (color) {
851
851
  return fillRule === FillRule.EvenOdd ? fillEvenOdd : fill;
852
- } else if (borderColor && borderWidth) {
852
+ } else if (borderColor && borderWidth !== 0) {
853
853
  return stroke;
854
854
  }
855
855
  return undefined;
@@ -29,7 +29,11 @@ const ChannelToColorSpace: { [idx: number]: ColorSpace | undefined } = {
29
29
  */
30
30
  class JpegEmbedder {
31
31
  static async for(imageData: Uint8Array) {
32
- const dataView = new DataView(imageData.buffer);
32
+ const dataView = new DataView(
33
+ imageData.buffer,
34
+ imageData.byteOffset,
35
+ imageData.byteLength,
36
+ );
33
37
 
34
38
  const soi = dataView.getUint16(0);
35
39
  if (soi !== 0xffd8) throw new Error('SOI not found in JPEG');
@@ -5,6 +5,7 @@ import PDFContext from '../PDFContext';
5
5
  import PDFPageTree from './PDFPageTree';
6
6
  import { PDFAcroForm } from '../acroform';
7
7
  import ViewerPreferences from '../interactive/ViewerPreferences';
8
+ import PDFArray from '../objects/PDFArray';
8
9
 
9
10
  class PDFCatalog extends PDFDict {
10
11
  static withContextAndPages = (
@@ -28,6 +29,14 @@ class PDFCatalog extends PDFDict {
28
29
  return this.lookupMaybe(PDFName.of('AcroForm'), PDFDict);
29
30
  }
30
31
 
32
+ Names(): PDFDict | undefined {
33
+ return this.lookupMaybe(PDFName.of('Names'), PDFDict);
34
+ }
35
+
36
+ AttachedFiles(): PDFArray | undefined {
37
+ return this.lookupMaybe(PDFName.of('AF'), PDFArray);
38
+ }
39
+
31
40
  getAcroForm(): PDFAcroForm | undefined {
32
41
  const dict = this.AcroForm();
33
42
  if (!dict) return undefined;
@@ -4,17 +4,18 @@ import PDFImage from './PDFImage';
4
4
  import PDFPage from './PDFPage';
5
5
  import PDFForm from './form/PDFForm';
6
6
  import { StandardFonts } from './StandardFonts';
7
- import { PageBoundingBox, PDFCatalog, PDFContext } from '../core';
7
+ import { PageBoundingBox, PDFCatalog, PDFContext, PDFDict } from '../core';
8
8
  import { AttachmentOptions, SaveOptions, Base64SaveOptions, LoadOptions, CreateOptions, EmbedFontOptions, SetTitleOptions, IncrementalSaveOptions } from './PDFDocumentOptions';
9
9
  import PDFObject from '../core/objects/PDFObject';
10
10
  import PDFRef from '../core/objects/PDFRef';
11
11
  import { Fontkit } from '../types/fontkit';
12
12
  import { TransformationMatrix } from '../types/matrix';
13
13
  import { AFRelationship } from '../core/embedders/FileEmbedder';
14
+ import PDFEmbeddedFile from './PDFEmbeddedFile';
14
15
  import PDFSvg from './PDFSvg';
15
16
  import { SecurityOptions } from '../core/security/PDFSecurity';
16
17
  import { DocumentSnapshot } from './snapshot';
17
- export type PDFAttachment = {
18
+ export type BasePDFAttachment = {
18
19
  name: string;
19
20
  data: Uint8Array;
20
21
  mimeType: string | undefined;
@@ -23,6 +24,14 @@ export type PDFAttachment = {
23
24
  creationDate: Date | undefined;
24
25
  modificationDate: Date | undefined;
25
26
  };
27
+ export type SavedPDFAttachment = BasePDFAttachment & {
28
+ embeddedFileDict: PDFDict;
29
+ specRef: PDFRef;
30
+ };
31
+ export type UnsavedPDFAttachment = BasePDFAttachment & {
32
+ pdfEmbeddedFile: PDFEmbeddedFile;
33
+ };
34
+ export type PDFAttachment = UnsavedPDFAttachment | SavedPDFAttachment;
26
35
  export type PDFObjectVersions = {
27
36
  ref: PDFRef;
28
37
  actual: PDFObject | undefined;
@@ -575,6 +584,11 @@ export default class PDFDocument {
575
584
  * @returns Array of attachments with name and data
576
585
  */
577
586
  getAttachments(): PDFAttachment[];
587
+ /**
588
+ * Removes an attachment from PDF, based on name.
589
+ * @param {string} name Name of the attachmet to remove.
590
+ */
591
+ detach(name: string): void;
578
592
  /**
579
593
  * Embed a font into this document. The input data can be provided in multiple
580
594
  * formats:
@@ -40,5 +40,11 @@ export default class PDFEmbeddedFile implements Embeddable {
40
40
  * @returns the embedder.
41
41
  */
42
42
  getEmbedder(): FileEmbedder;
43
+ /**
44
+ * Returns whether or not this file has already been embedded.
45
+ * @returns true if the file has already been embedded, false otherwise.
46
+ */
47
+ getAlreadyEmbedded(): boolean;
48
+ getRef(): PDFRef;
43
49
  }
44
50
  //# sourceMappingURL=PDFEmbeddedFile.d.ts.map
@@ -4,11 +4,14 @@ import PDFContext from '../PDFContext';
4
4
  import PDFPageTree from './PDFPageTree';
5
5
  import { PDFAcroForm } from '../acroform';
6
6
  import ViewerPreferences from '../interactive/ViewerPreferences';
7
+ import PDFArray from '../objects/PDFArray';
7
8
  declare class PDFCatalog extends PDFDict {
8
9
  static withContextAndPages: (context: PDFContext, pages: PDFPageTree | PDFRef) => PDFCatalog;
9
10
  static fromMapWithContext: (map: DictMap, context: PDFContext) => PDFCatalog;
10
11
  Pages(): PDFPageTree;
11
12
  AcroForm(): PDFDict | undefined;
13
+ Names(): PDFDict | undefined;
14
+ AttachedFiles(): PDFArray | undefined;
12
15
  getAcroForm(): PDFAcroForm | undefined;
13
16
  getOrCreateAcroForm(): PDFAcroForm;
14
17
  ViewerPreferences(): PDFDict | undefined;
@@ -4,17 +4,18 @@ import PDFImage from './PDFImage';
4
4
  import PDFPage from './PDFPage';
5
5
  import PDFForm from './form/PDFForm';
6
6
  import { StandardFonts } from './StandardFonts';
7
- import { PageBoundingBox, PDFCatalog, PDFContext } from '../core';
7
+ import { PageBoundingBox, PDFCatalog, PDFContext, PDFDict } from '../core';
8
8
  import { AttachmentOptions, SaveOptions, Base64SaveOptions, LoadOptions, CreateOptions, EmbedFontOptions, SetTitleOptions, IncrementalSaveOptions } from './PDFDocumentOptions';
9
9
  import PDFObject from '../core/objects/PDFObject';
10
10
  import PDFRef from '../core/objects/PDFRef';
11
11
  import { Fontkit } from '../types/fontkit';
12
12
  import { TransformationMatrix } from '../types/matrix';
13
13
  import { AFRelationship } from '../core/embedders/FileEmbedder';
14
+ import PDFEmbeddedFile from './PDFEmbeddedFile';
14
15
  import PDFSvg from './PDFSvg';
15
16
  import { SecurityOptions } from '../core/security/PDFSecurity';
16
17
  import { DocumentSnapshot } from './snapshot';
17
- export type PDFAttachment = {
18
+ export type BasePDFAttachment = {
18
19
  name: string;
19
20
  data: Uint8Array;
20
21
  mimeType: string | undefined;
@@ -23,6 +24,14 @@ export type PDFAttachment = {
23
24
  creationDate: Date | undefined;
24
25
  modificationDate: Date | undefined;
25
26
  };
27
+ export type SavedPDFAttachment = BasePDFAttachment & {
28
+ embeddedFileDict: PDFDict;
29
+ specRef: PDFRef;
30
+ };
31
+ export type UnsavedPDFAttachment = BasePDFAttachment & {
32
+ pdfEmbeddedFile: PDFEmbeddedFile;
33
+ };
34
+ export type PDFAttachment = UnsavedPDFAttachment | SavedPDFAttachment;
26
35
  export type PDFObjectVersions = {
27
36
  ref: PDFRef;
28
37
  actual: PDFObject | undefined;
@@ -575,6 +584,11 @@ export default class PDFDocument {
575
584
  * @returns Array of attachments with name and data
576
585
  */
577
586
  getAttachments(): PDFAttachment[];
587
+ /**
588
+ * Removes an attachment from PDF, based on name.
589
+ * @param {string} name Name of the attachmet to remove.
590
+ */
591
+ detach(name: string): void;
578
592
  /**
579
593
  * Embed a font into this document. The input data can be provided in multiple
580
594
  * formats:
@@ -40,5 +40,11 @@ export default class PDFEmbeddedFile implements Embeddable {
40
40
  * @returns the embedder.
41
41
  */
42
42
  getEmbedder(): FileEmbedder;
43
+ /**
44
+ * Returns whether or not this file has already been embedded.
45
+ * @returns true if the file has already been embedded, false otherwise.
46
+ */
47
+ getAlreadyEmbedded(): boolean;
48
+ getRef(): PDFRef;
43
49
  }
44
50
  //# sourceMappingURL=PDFEmbeddedFile.d.ts.map
@@ -4,11 +4,14 @@ import PDFContext from '../PDFContext';
4
4
  import PDFPageTree from './PDFPageTree';
5
5
  import { PDFAcroForm } from '../acroform';
6
6
  import ViewerPreferences from '../interactive/ViewerPreferences';
7
+ import PDFArray from '../objects/PDFArray';
7
8
  declare class PDFCatalog extends PDFDict {
8
9
  static withContextAndPages: (context: PDFContext, pages: PDFPageTree | PDFRef) => PDFCatalog;
9
10
  static fromMapWithContext: (map: DictMap, context: PDFContext) => PDFCatalog;
10
11
  Pages(): PDFPageTree;
11
12
  AcroForm(): PDFDict | undefined;
13
+ Names(): PDFDict | undefined;
14
+ AttachedFiles(): PDFArray | undefined;
12
15
  getAcroForm(): PDFAcroForm | undefined;
13
16
  getOrCreateAcroForm(): PDFAcroForm;
14
17
  ViewerPreferences(): PDFDict | undefined;