pdf-parser.js 3.0.7 → 4.5.1
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 +105 -54
- package/dist/{afm-widths-Dxucrg7D.js → afm-widths-BTu0IDp2.cjs} +1517 -4
- package/dist/{afm-widths-DyDq56Ph.d.cts → afm-widths-CneRyu5l.d.cts} +1 -1
- package/dist/{afm-widths-DyDq56Ph.d.ts → afm-widths-CneRyu5l.d.ts} +1 -1
- package/dist/{afm-widths-BoeTOK2r.cjs → afm-widths-De_QMWgC.js} +1416 -51
- package/dist/afm-widths.cjs +1 -1
- package/dist/afm-widths.d.cts +1 -1
- package/dist/afm-widths.d.ts +1 -1
- package/dist/afm-widths.js +1 -1
- package/dist/annotations.cjs +104 -0
- package/dist/annotations.d.cts +9 -0
- package/dist/annotations.d.ts +9 -0
- package/dist/annotations.js +103 -0
- package/dist/attachments.cjs +65 -0
- package/dist/attachments.d.cts +8 -0
- package/dist/attachments.d.ts +8 -0
- package/dist/attachments.js +64 -0
- package/dist/builtin-encoding.cjs +221 -0
- package/dist/builtin-encoding.d.cts +8 -0
- package/dist/builtin-encoding.d.ts +8 -0
- package/dist/builtin-encoding.js +220 -0
- package/dist/bytes/flate.cjs +1 -1
- package/dist/bytes/flate.js +1 -1
- package/dist/cff.cjs +14 -0
- package/dist/cff.d.cts +4 -1
- package/dist/cff.d.ts +4 -1
- package/dist/cff.js +12 -1
- package/dist/cmap-table.cjs +76 -13
- package/dist/cmap-table.d.cts +9 -1
- package/dist/cmap-table.d.ts +9 -1
- package/dist/cmap-table.js +77 -15
- package/dist/codec.cjs +1 -1
- package/dist/codec.d.cts +134 -0
- package/dist/codec.d.ts +134 -0
- package/dist/codec.js +1 -1
- package/dist/content-read.cjs +1 -1
- package/dist/content-read.d.cts +3 -3
- package/dist/content-read.d.ts +3 -3
- package/dist/content-read.js +1 -1
- package/dist/content-write.cjs +32 -10
- package/dist/content-write.d.cts +12 -5
- package/dist/content-write.d.ts +12 -5
- package/dist/content-write.js +32 -10
- package/dist/crypto/random.cjs +9 -0
- package/dist/crypto/random.d.cts +4 -0
- package/dist/crypto/random.d.ts +4 -0
- package/dist/crypto/random.js +8 -0
- package/dist/diagnostics.d.cts +1 -1
- package/dist/diagnostics.d.ts +1 -1
- package/dist/document.cjs +12 -3
- package/dist/document.d.cts +3 -1
- package/dist/document.d.ts +3 -1
- package/dist/document.js +12 -3
- package/dist/{embedded-font-fREdbxnr.d.ts → embedded-font-B4p9a3O3.d.ts} +3 -1
- package/dist/{embedded-font-BU6Jgcof.d.cts → embedded-font-oc65VGlr.d.cts} +3 -1
- package/dist/embedded-font-write.cjs +1 -1
- package/dist/embedded-font-write.d.cts +3 -3
- package/dist/embedded-font-write.d.ts +3 -3
- package/dist/embedded-font-write.js +1 -1
- package/dist/embedded-font.cjs +46 -15
- package/dist/embedded-font.d.cts +1 -1
- package/dist/embedded-font.d.ts +1 -1
- package/dist/embedded-font.js +46 -15
- package/dist/encoding.cjs +10 -1
- package/dist/encoding.d.cts +10 -1
- package/dist/encoding.d.ts +10 -1
- package/dist/encoding.js +2 -2
- package/dist/encrypt-write.cjs +234 -0
- package/dist/encrypt-write.d.cts +31 -0
- package/dist/encrypt-write.d.ts +31 -0
- package/dist/encrypt-write.js +231 -0
- package/dist/encrypt.cjs +51 -21
- package/dist/encrypt.d.cts +19 -3
- package/dist/encrypt.d.ts +19 -3
- package/dist/encrypt.js +36 -22
- package/dist/filters.cjs +18 -14
- package/dist/filters.d.cts +1 -1
- package/dist/filters.d.ts +1 -1
- package/dist/filters.js +18 -14
- package/dist/font-read.cjs +68 -13
- package/dist/font-read.d.cts +1 -1
- package/dist/font-read.d.ts +1 -1
- package/dist/font-read.js +69 -14
- package/dist/font-registry.cjs +1 -1
- package/dist/font-registry.d.cts +4 -4
- package/dist/font-registry.d.ts +4 -4
- package/dist/font-registry.js +1 -1
- package/dist/font-substitutes.d.cts +1 -1
- package/dist/font-substitutes.d.ts +1 -1
- package/dist/font-tables.cjs +31 -0
- package/dist/font-tables.d.cts +3 -1
- package/dist/font-tables.d.ts +3 -1
- package/dist/font-tables.js +31 -2
- package/dist/fonts.d.cts +2 -2
- package/dist/fonts.d.ts +2 -2
- package/dist/form.cjs +138 -0
- package/dist/form.d.cts +9 -0
- package/dist/form.d.ts +9 -0
- package/dist/form.js +137 -0
- package/dist/gsub-table-BRTQ8EUW.d.ts +10 -0
- package/dist/gsub-table-URczLd85.d.cts +10 -0
- package/dist/gsub-table.cjs +225 -0
- package/dist/gsub-table.d.cts +2 -0
- package/dist/gsub-table.d.ts +2 -0
- package/dist/gsub-table.js +224 -0
- package/dist/image/ccitt-encode.cjs +119 -0
- package/dist/image/ccitt-encode.d.cts +9 -0
- package/dist/image/ccitt-encode.d.ts +9 -0
- package/dist/image/ccitt-encode.js +118 -0
- package/dist/image/ccitt.cjs +3 -0
- package/dist/image/ccitt.d.cts +4 -1
- package/dist/image/ccitt.d.ts +4 -1
- package/dist/image/ccitt.js +1 -1
- package/dist/image/jbig2-bitmap.d.cts +1 -1
- package/dist/image/jbig2-bitmap.d.ts +1 -1
- package/dist/image/jbig2.cjs +3 -1
- package/dist/image/jbig2.js +3 -1
- package/dist/image/jp2-boxes.d.cts +1 -1
- package/dist/image/jp2-boxes.d.ts +1 -1
- package/dist/image/jpeg2000-codestream.d.cts +3 -3
- package/dist/image/jpeg2000-codestream.d.ts +3 -3
- package/dist/image/jpeg2000-t1.d.cts +1 -1
- package/dist/image/jpeg2000-t1.d.ts +1 -1
- package/dist/image/jpeg2000.cjs +1 -0
- package/dist/image/jpeg2000.d.cts +3 -0
- package/dist/image/jpeg2000.d.ts +3 -0
- package/dist/image/jpeg2000.js +1 -0
- package/dist/image/png-decode.cjs +1 -1
- package/dist/image/png-decode.js +1 -1
- package/dist/image/png-filter.d.cts +1 -1
- package/dist/image/png-filter.d.ts +1 -1
- package/dist/images-read.cjs +18 -12
- package/dist/images-read.d.cts +2 -2
- package/dist/images-read.d.ts +2 -2
- package/dist/images-read.js +15 -9
- package/dist/index.cjs +17 -4
- package/dist/index.d.cts +7 -6
- package/dist/index.d.ts +7 -6
- package/dist/index.js +6 -5
- package/dist/interpret.cjs +178 -56
- package/dist/interpret.d.cts +27 -12
- package/dist/interpret.d.ts +27 -12
- package/dist/interpret.js +178 -56
- package/dist/layout.cjs +149 -2
- package/dist/layout.d.cts +394 -1
- package/dist/layout.d.ts +394 -1
- package/dist/layout.js +140 -4
- package/dist/lexer.d.cts +9 -9
- package/dist/lexer.d.ts +9 -9
- package/dist/math-content-write.cjs +1 -1
- package/dist/math-content-write.js +1 -1
- package/dist/math-font-write.cjs +1 -1
- package/dist/math-font-write.d.cts +1 -1
- package/dist/math-font-write.d.ts +1 -1
- package/dist/math-font-write.js +1 -1
- package/dist/math-font.cjs +2 -2
- package/dist/math-font.d.cts +1 -1
- package/dist/math-font.d.ts +1 -1
- package/dist/math-font.js +2 -2
- package/dist/{math-stretch-a_rHNRvc.d.ts → math-stretch-BbC2o4Br.d.ts} +1 -1
- package/dist/{math-stretch-E26z6byT.d.cts → math-stretch-C2JanDAz.d.cts} +1 -1
- package/dist/math-stretch.d.cts +1 -1
- package/dist/math-stretch.d.ts +1 -1
- package/dist/measure.cjs +1 -1
- package/dist/measure.d.cts +1 -1
- package/dist/measure.d.ts +1 -1
- package/dist/measure.js +1 -1
- package/dist/names.cjs +41 -0
- package/dist/names.d.cts +11 -0
- package/dist/names.d.ts +11 -0
- package/dist/names.js +40 -0
- package/dist/navigation.cjs +210 -0
- package/dist/navigation.d.cts +18 -0
- package/dist/navigation.d.ts +18 -0
- package/dist/navigation.js +207 -0
- package/dist/notes-annotation-author.cjs +5 -0
- package/dist/notes-annotation-author.d.cts +4 -0
- package/dist/notes-annotation-author.d.ts +4 -0
- package/dist/notes-annotation-author.js +4 -0
- package/dist/objects-B7HdMeWS.d.cts +59 -0
- package/dist/objects-B7HdMeWS.d.ts +59 -0
- package/dist/objects.d.cts +1 -58
- package/dist/objects.d.ts +1 -58
- package/dist/optional-content.cjs +63 -0
- package/dist/optional-content.d.cts +12 -0
- package/dist/optional-content.d.ts +12 -0
- package/dist/optional-content.js +62 -0
- package/dist/parse.cjs +1 -1
- package/dist/parse.d.cts +2 -2
- package/dist/parse.d.ts +2 -2
- package/dist/parse.js +1 -1
- package/dist/pdf-text.cjs +21 -0
- package/dist/pdf-text.d.cts +5 -0
- package/dist/pdf-text.d.ts +5 -0
- package/dist/pdf-text.js +19 -0
- package/dist/predictors.d.cts +1 -1
- package/dist/predictors.d.ts +1 -1
- package/dist/read.cjs +287 -72
- package/dist/read.d.cts +2 -4
- package/dist/read.d.ts +2 -4
- package/dist/read.js +284 -67
- package/dist/serialize.cjs +5 -1
- package/dist/serialize.d.cts +3 -2
- package/dist/serialize.d.ts +3 -2
- package/dist/serialize.js +5 -2
- package/dist/sfnt-subset.cjs +10 -3
- package/dist/sfnt-subset.d.cts +1 -1
- package/dist/sfnt-subset.d.ts +1 -1
- package/dist/sfnt-subset.js +10 -3
- package/dist/structure.cjs +184 -0
- package/dist/structure.d.cts +12 -0
- package/dist/structure.d.ts +12 -0
- package/dist/structure.js +183 -0
- package/dist/tounicode.cjs +8 -3
- package/dist/tounicode.d.cts +2 -2
- package/dist/tounicode.d.ts +2 -2
- package/dist/tounicode.js +8 -3
- package/dist/util/base64.cjs +4 -4
- package/dist/util/base64.js +4 -4
- package/dist/winansi.cjs +1 -1
- package/dist/winansi.d.cts +1 -1
- package/dist/winansi.d.ts +1 -1
- package/dist/winansi.js +1 -1
- package/dist/write.cjs +464 -21
- package/dist/write.d.cts +4 -3
- package/dist/write.d.ts +4 -3
- package/dist/write.js +464 -20
- package/dist/xmp.cjs +46 -0
- package/dist/xmp.d.cts +14 -0
- package/dist/xmp.d.ts +14 -0
- package/dist/xmp.js +45 -0
- package/dist/xref.cjs +2 -2
- package/dist/xref.d.cts +3 -3
- package/dist/xref.d.ts +3 -3
- package/dist/xref.js +2 -2
- package/package.json +46 -31
- package/dist/image/png-encode.cjs +0 -64
- package/dist/image/png-encode.d.cts +0 -8
- package/dist/image/png-encode.d.ts +0 -8
- package/dist/image/png-encode.js +0 -63
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_objects = require("./objects.cjs");
|
|
3
|
+
const require_bytes_writer = require("./bytes/writer.cjs");
|
|
4
|
+
const require_crypto_aes = require("./crypto/aes.cjs");
|
|
5
|
+
const require_crypto_md5 = require("./crypto/md5.cjs");
|
|
6
|
+
const require_crypto_rc4 = require("./crypto/rc4.cjs");
|
|
7
|
+
const require_encrypt = require("./encrypt.cjs");
|
|
8
|
+
const require_crypto_random = require("./crypto/random.cjs");
|
|
9
|
+
//#region src/encrypt-write.ts
|
|
10
|
+
var PdfEncryptionError = class extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "PdfEncryptionError";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const RC4_128_KEY_BYTES = 16;
|
|
17
|
+
const R6_PASSWORD_MAX_BYTES = 127;
|
|
18
|
+
const RESERVED_BIT_7_AND_8 = 192;
|
|
19
|
+
const DEPRECATED_ALWAYS_ONE_BIT_10 = 512;
|
|
20
|
+
const SCHEME_SPECS = {
|
|
21
|
+
"rc4-40": {
|
|
22
|
+
v: 1,
|
|
23
|
+
r: 2,
|
|
24
|
+
keyBytes: 5,
|
|
25
|
+
method: "rc4"
|
|
26
|
+
},
|
|
27
|
+
"rc4-128": {
|
|
28
|
+
v: 2,
|
|
29
|
+
r: 3,
|
|
30
|
+
keyBytes: RC4_128_KEY_BYTES,
|
|
31
|
+
method: "rc4"
|
|
32
|
+
},
|
|
33
|
+
"aes-128": {
|
|
34
|
+
v: 4,
|
|
35
|
+
r: 4,
|
|
36
|
+
keyBytes: 16,
|
|
37
|
+
method: "aes"
|
|
38
|
+
},
|
|
39
|
+
"aes-256": {
|
|
40
|
+
v: 5,
|
|
41
|
+
r: 6,
|
|
42
|
+
keyBytes: 32,
|
|
43
|
+
method: "aes"
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
function legacyPasswordBytes(password) {
|
|
47
|
+
const bytes = new Uint8Array(password.length);
|
|
48
|
+
for (let i = 0; i < password.length; i++) {
|
|
49
|
+
const code = password.charCodeAt(i);
|
|
50
|
+
if (code > 127) throw new PdfEncryptionError(`password contains character code ${String(code)}, outside the printable-ASCII range this writer supports for the rc4-40/rc4-128/aes-128 schemes; use a plain-ASCII password, or the aes-256 scheme, whose revision-6 passwords are Unicode`);
|
|
51
|
+
bytes[i] = code;
|
|
52
|
+
}
|
|
53
|
+
return bytes;
|
|
54
|
+
}
|
|
55
|
+
function r6PasswordBytes(password) {
|
|
56
|
+
return new TextEncoder().encode(password.normalize("NFKC")).subarray(0, R6_PASSWORD_MAX_BYTES);
|
|
57
|
+
}
|
|
58
|
+
function permissionsToP(permissions) {
|
|
59
|
+
let p = 0;
|
|
60
|
+
if (permissions?.print ?? true) p |= 4;
|
|
61
|
+
if (permissions?.modifyContents ?? true) p |= 8;
|
|
62
|
+
if (permissions?.copy ?? true) p |= 16;
|
|
63
|
+
if (permissions?.annotate ?? true) p |= 32;
|
|
64
|
+
p |= RESERVED_BIT_7_AND_8;
|
|
65
|
+
if (permissions?.fillForms ?? true) p |= 256;
|
|
66
|
+
p |= DEPRECATED_ALWAYS_ONE_BIT_10;
|
|
67
|
+
if (permissions?.assemble ?? true) p |= 1024;
|
|
68
|
+
if (permissions?.printHighRes ?? true) p |= 2048;
|
|
69
|
+
for (let bit = 13; bit <= 32; bit++) p |= 1 << bit - 1;
|
|
70
|
+
return p;
|
|
71
|
+
}
|
|
72
|
+
function computeLegacyOwnerValue(ownerPassword, userPassword, revision, keyBytes) {
|
|
73
|
+
let digest = require_crypto_md5.md5(require_encrypt.padOrTruncatePassword(ownerPassword));
|
|
74
|
+
if (revision >= 3) for (let i = 0; i < 50; i++) digest = require_crypto_md5.md5(digest);
|
|
75
|
+
const ownerKey = digest.subarray(0, keyBytes);
|
|
76
|
+
let value = require_crypto_rc4.rc4(ownerKey, require_encrypt.padOrTruncatePassword(userPassword));
|
|
77
|
+
if (revision >= 3) for (let i = 1; i <= 19; i++) {
|
|
78
|
+
const roundKey = Uint8Array.from(ownerKey, (byte) => byte ^ i);
|
|
79
|
+
value = require_crypto_rc4.rc4(roundKey, value);
|
|
80
|
+
}
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
function computeLegacyUserValue(fileKey, fileId, revision) {
|
|
84
|
+
const core = require_encrypt.legacyUserValueCore(fileKey, fileId, revision);
|
|
85
|
+
if (revision === 2) return core;
|
|
86
|
+
return require_bytes_writer.concatBytes([core, require_crypto_random.randomBytes(require_encrypt.PASSWORD_PADDING.length - core.length)]);
|
|
87
|
+
}
|
|
88
|
+
function encryptAes(key, data) {
|
|
89
|
+
const iv = require_crypto_random.randomBytes(16);
|
|
90
|
+
const padLength = 16 - data.length % 16;
|
|
91
|
+
const padded = new Uint8Array(data.length + padLength);
|
|
92
|
+
padded.set(data);
|
|
93
|
+
padded.fill(padLength, data.length);
|
|
94
|
+
return require_bytes_writer.concatBytes([iv, require_crypto_aes.aesCbcEncrypt(key, iv, padded)]);
|
|
95
|
+
}
|
|
96
|
+
function applyEncryptMethod(method, fileKey, perObjectKeys, bytes, num, gen) {
|
|
97
|
+
if (method === "identity") return bytes;
|
|
98
|
+
const key = perObjectKeys ? require_encrypt.objectKey(fileKey, num, gen, method) : fileKey;
|
|
99
|
+
return method === "rc4" ? require_crypto_rc4.rc4(key, bytes) : encryptAes(key, bytes);
|
|
100
|
+
}
|
|
101
|
+
function buildEncryptor(encryptDict, fileKey, method, perObjectKeys, encryptMetadata) {
|
|
102
|
+
return {
|
|
103
|
+
encryptDict,
|
|
104
|
+
encryptString(bytes, num, gen) {
|
|
105
|
+
return applyEncryptMethod(method, fileKey, perObjectKeys, bytes, num, gen);
|
|
106
|
+
},
|
|
107
|
+
encryptStream(bytes, dict, num, gen) {
|
|
108
|
+
const type = dict.entries.get("Type");
|
|
109
|
+
if (!encryptMetadata && type?.kind === "name" && type.name === "Metadata") return bytes;
|
|
110
|
+
return applyEncryptMethod(method, fileKey, perObjectKeys, bytes, num, gen);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function buildLegacyEncryptor(spec, options, fileId) {
|
|
115
|
+
const userPassword = legacyPasswordBytes(options.userPassword ?? "");
|
|
116
|
+
const ownerPassword = legacyPasswordBytes(options.ownerPassword ?? options.userPassword ?? "");
|
|
117
|
+
const encryptMetadata = options.encryptMetadata ?? true;
|
|
118
|
+
const p = permissionsToP(options.permissions);
|
|
119
|
+
const owner = computeLegacyOwnerValue(ownerPassword, userPassword, spec.r, spec.keyBytes);
|
|
120
|
+
const fileKey = require_encrypt.computeLegacyFileKeyFromPaddedPassword(require_encrypt.padOrTruncatePassword(userPassword), owner, p, fileId, spec.r, spec.keyBytes, encryptMetadata);
|
|
121
|
+
const user = computeLegacyUserValue(fileKey, fileId, spec.r);
|
|
122
|
+
const entries = /* @__PURE__ */ new Map([
|
|
123
|
+
["Filter", require_objects.pdfName("Standard")],
|
|
124
|
+
["V", require_objects.pdfNum(spec.v)],
|
|
125
|
+
["R", require_objects.pdfNum(spec.r)],
|
|
126
|
+
["O", require_objects.pdfHexString(owner)],
|
|
127
|
+
["U", require_objects.pdfHexString(user)],
|
|
128
|
+
["P", require_objects.pdfNum(p)],
|
|
129
|
+
["Length", require_objects.pdfNum(spec.keyBytes * 8)]
|
|
130
|
+
]);
|
|
131
|
+
if (spec.v === 4) {
|
|
132
|
+
entries.set("CF", require_objects.pdfDict({ StdCF: require_objects.pdfDict({
|
|
133
|
+
AuthEvent: require_objects.pdfName("DocOpen"),
|
|
134
|
+
CFM: require_objects.pdfName("AESV2"),
|
|
135
|
+
Length: require_objects.pdfNum(spec.keyBytes)
|
|
136
|
+
}) }));
|
|
137
|
+
entries.set("StmF", require_objects.pdfName("StdCF"));
|
|
138
|
+
entries.set("StrF", require_objects.pdfName("StdCF"));
|
|
139
|
+
entries.set("EncryptMetadata", require_objects.pdfBool(encryptMetadata));
|
|
140
|
+
}
|
|
141
|
+
return buildEncryptor(require_objects.pdfDict(entries), fileKey, spec.method, true, encryptMetadata);
|
|
142
|
+
}
|
|
143
|
+
function buildAes256Encryptor(spec, options) {
|
|
144
|
+
const userPassword = r6PasswordBytes(options.userPassword ?? "");
|
|
145
|
+
const ownerPassword = r6PasswordBytes(options.ownerPassword ?? options.userPassword ?? "");
|
|
146
|
+
const encryptMetadata = options.encryptMetadata ?? true;
|
|
147
|
+
const p = permissionsToP(options.permissions);
|
|
148
|
+
const fileKey = require_crypto_random.randomBytes(32);
|
|
149
|
+
const userValidationSalt = require_crypto_random.randomBytes(8);
|
|
150
|
+
const userKeySalt = require_crypto_random.randomBytes(8);
|
|
151
|
+
const empty = /* @__PURE__ */ new Uint8Array(0);
|
|
152
|
+
const userHash = require_encrypt.hardenedHash(userPassword, userValidationSalt, empty, spec.r);
|
|
153
|
+
const u = require_bytes_writer.concatBytes([
|
|
154
|
+
userHash,
|
|
155
|
+
userValidationSalt,
|
|
156
|
+
userKeySalt
|
|
157
|
+
]);
|
|
158
|
+
const userIntermediateKey = require_encrypt.hardenedHash(userPassword, userKeySalt, empty, spec.r);
|
|
159
|
+
const ue = require_crypto_aes.aesCbcEncrypt(userIntermediateKey, require_encrypt.ZERO_IV, fileKey);
|
|
160
|
+
const ownerValidationSalt = require_crypto_random.randomBytes(8);
|
|
161
|
+
const ownerKeySalt = require_crypto_random.randomBytes(8);
|
|
162
|
+
const ownerHash = require_encrypt.hardenedHash(ownerPassword, ownerValidationSalt, u, spec.r);
|
|
163
|
+
const o = require_bytes_writer.concatBytes([
|
|
164
|
+
ownerHash,
|
|
165
|
+
ownerValidationSalt,
|
|
166
|
+
ownerKeySalt
|
|
167
|
+
]);
|
|
168
|
+
const ownerIntermediateKey = require_encrypt.hardenedHash(ownerPassword, ownerKeySalt, u, spec.r);
|
|
169
|
+
const oe = require_crypto_aes.aesCbcEncrypt(ownerIntermediateKey, require_encrypt.ZERO_IV, fileKey);
|
|
170
|
+
const permsBlock = /* @__PURE__ */ new Uint8Array(16);
|
|
171
|
+
permsBlock.set(require_encrypt.permissionsBytes(p), 0);
|
|
172
|
+
permsBlock.set([
|
|
173
|
+
255,
|
|
174
|
+
255,
|
|
175
|
+
255,
|
|
176
|
+
255
|
|
177
|
+
], 4);
|
|
178
|
+
permsBlock[8] = encryptMetadata ? 84 : 70;
|
|
179
|
+
permsBlock.set([
|
|
180
|
+
97,
|
|
181
|
+
100,
|
|
182
|
+
98
|
|
183
|
+
], 9);
|
|
184
|
+
permsBlock.set(require_crypto_random.randomBytes(4), 12);
|
|
185
|
+
const perms = require_crypto_aes.aesCbcEncrypt(fileKey, require_encrypt.ZERO_IV, permsBlock);
|
|
186
|
+
const entries = /* @__PURE__ */ new Map([
|
|
187
|
+
["Filter", require_objects.pdfName("Standard")],
|
|
188
|
+
["V", require_objects.pdfNum(spec.v)],
|
|
189
|
+
["R", require_objects.pdfNum(spec.r)],
|
|
190
|
+
["O", require_objects.pdfHexString(o)],
|
|
191
|
+
["U", require_objects.pdfHexString(u)],
|
|
192
|
+
["OE", require_objects.pdfHexString(oe)],
|
|
193
|
+
["UE", require_objects.pdfHexString(ue)],
|
|
194
|
+
["P", require_objects.pdfNum(p)],
|
|
195
|
+
["Perms", require_objects.pdfHexString(perms)],
|
|
196
|
+
["Length", require_objects.pdfNum(spec.keyBytes * 8)],
|
|
197
|
+
["CF", require_objects.pdfDict({ StdCF: require_objects.pdfDict({
|
|
198
|
+
AuthEvent: require_objects.pdfName("DocOpen"),
|
|
199
|
+
CFM: require_objects.pdfName("AESV3"),
|
|
200
|
+
Length: require_objects.pdfNum(spec.keyBytes)
|
|
201
|
+
}) })],
|
|
202
|
+
["StmF", require_objects.pdfName("StdCF")],
|
|
203
|
+
["StrF", require_objects.pdfName("StdCF")],
|
|
204
|
+
["EncryptMetadata", require_objects.pdfBool(encryptMetadata)]
|
|
205
|
+
]);
|
|
206
|
+
return buildEncryptor(require_objects.pdfDict(entries), fileKey, spec.method, false, encryptMetadata);
|
|
207
|
+
}
|
|
208
|
+
function createStandardEncryptor(options, fileId) {
|
|
209
|
+
const scheme = options.scheme ?? "aes-256";
|
|
210
|
+
const spec = SCHEME_SPECS[scheme];
|
|
211
|
+
return spec.v === 5 ? buildAes256Encryptor(spec, options) : buildLegacyEncryptor(spec, options, fileId);
|
|
212
|
+
}
|
|
213
|
+
function encryptIndirectObject(value, num, gen, encryptor) {
|
|
214
|
+
if (value.kind === "string") return {
|
|
215
|
+
kind: "string",
|
|
216
|
+
bytes: encryptor.encryptString(value.bytes, num, gen),
|
|
217
|
+
hex: value.hex
|
|
218
|
+
};
|
|
219
|
+
if (value.kind === "array") return require_objects.pdfArray(value.items.map((item) => encryptIndirectObject(item, num, gen, encryptor)));
|
|
220
|
+
if (value.kind === "dict") return encryptDictEntries(value, num, gen, encryptor);
|
|
221
|
+
if (value.kind === "stream") return {
|
|
222
|
+
kind: "stream",
|
|
223
|
+
dict: encryptDictEntries(value.dict, num, gen, encryptor),
|
|
224
|
+
raw: encryptor.encryptStream(value.raw, value.dict, num, gen)
|
|
225
|
+
};
|
|
226
|
+
return value;
|
|
227
|
+
}
|
|
228
|
+
function encryptDictEntries(dict, num, gen, encryptor) {
|
|
229
|
+
return require_objects.pdfDict(new Map(Array.from(dict.entries, ([key, entry]) => [key, encryptIndirectObject(entry, num, gen, encryptor)])));
|
|
230
|
+
}
|
|
231
|
+
//#endregion
|
|
232
|
+
exports.PdfEncryptionError = PdfEncryptionError;
|
|
233
|
+
exports.createStandardEncryptor = createStandardEncryptor;
|
|
234
|
+
exports.encryptIndirectObject = encryptIndirectObject;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { n as PdfDict, r as PdfObject } from "./objects-B7HdMeWS.cjs";
|
|
2
|
+
//#region src/encrypt-write.d.ts
|
|
3
|
+
declare class PdfEncryptionError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
type PdfEncryptionScheme = "rc4-40" | "rc4-128" | "aes-128" | "aes-256";
|
|
7
|
+
interface PdfEncryptionPermissions {
|
|
8
|
+
readonly print?: boolean;
|
|
9
|
+
readonly modifyContents?: boolean;
|
|
10
|
+
readonly copy?: boolean;
|
|
11
|
+
readonly annotate?: boolean;
|
|
12
|
+
readonly fillForms?: boolean;
|
|
13
|
+
readonly assemble?: boolean;
|
|
14
|
+
readonly printHighRes?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface PdfEncryptionOptions {
|
|
17
|
+
readonly userPassword?: string;
|
|
18
|
+
readonly ownerPassword?: string;
|
|
19
|
+
readonly scheme?: PdfEncryptionScheme;
|
|
20
|
+
readonly permissions?: PdfEncryptionPermissions;
|
|
21
|
+
readonly encryptMetadata?: boolean;
|
|
22
|
+
}
|
|
23
|
+
interface PdfEncryptor {
|
|
24
|
+
readonly encryptDict: PdfDict;
|
|
25
|
+
encryptString(bytes: Uint8Array<ArrayBuffer>, num: number, gen: number): Uint8Array<ArrayBuffer>;
|
|
26
|
+
encryptStream(bytes: Uint8Array<ArrayBuffer>, dict: PdfDict, num: number, gen: number): Uint8Array<ArrayBuffer>;
|
|
27
|
+
}
|
|
28
|
+
declare function createStandardEncryptor(options: PdfEncryptionOptions, fileId: Uint8Array<ArrayBuffer>): PdfEncryptor;
|
|
29
|
+
declare function encryptIndirectObject(value: PdfObject, num: number, gen: number, encryptor: PdfEncryptor): PdfObject;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { PdfEncryptionError, PdfEncryptionOptions, PdfEncryptionPermissions, PdfEncryptionScheme, PdfEncryptor, createStandardEncryptor, encryptIndirectObject };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { n as PdfDict, r as PdfObject } from "./objects-B7HdMeWS.js";
|
|
2
|
+
//#region src/encrypt-write.d.ts
|
|
3
|
+
declare class PdfEncryptionError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
type PdfEncryptionScheme = "rc4-40" | "rc4-128" | "aes-128" | "aes-256";
|
|
7
|
+
interface PdfEncryptionPermissions {
|
|
8
|
+
readonly print?: boolean;
|
|
9
|
+
readonly modifyContents?: boolean;
|
|
10
|
+
readonly copy?: boolean;
|
|
11
|
+
readonly annotate?: boolean;
|
|
12
|
+
readonly fillForms?: boolean;
|
|
13
|
+
readonly assemble?: boolean;
|
|
14
|
+
readonly printHighRes?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface PdfEncryptionOptions {
|
|
17
|
+
readonly userPassword?: string;
|
|
18
|
+
readonly ownerPassword?: string;
|
|
19
|
+
readonly scheme?: PdfEncryptionScheme;
|
|
20
|
+
readonly permissions?: PdfEncryptionPermissions;
|
|
21
|
+
readonly encryptMetadata?: boolean;
|
|
22
|
+
}
|
|
23
|
+
interface PdfEncryptor {
|
|
24
|
+
readonly encryptDict: PdfDict;
|
|
25
|
+
encryptString(bytes: Uint8Array<ArrayBuffer>, num: number, gen: number): Uint8Array<ArrayBuffer>;
|
|
26
|
+
encryptStream(bytes: Uint8Array<ArrayBuffer>, dict: PdfDict, num: number, gen: number): Uint8Array<ArrayBuffer>;
|
|
27
|
+
}
|
|
28
|
+
declare function createStandardEncryptor(options: PdfEncryptionOptions, fileId: Uint8Array<ArrayBuffer>): PdfEncryptor;
|
|
29
|
+
declare function encryptIndirectObject(value: PdfObject, num: number, gen: number, encryptor: PdfEncryptor): PdfObject;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { PdfEncryptionError, PdfEncryptionOptions, PdfEncryptionPermissions, PdfEncryptionScheme, PdfEncryptor, createStandardEncryptor, encryptIndirectObject };
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { pdfArray, pdfBool, pdfDict, pdfHexString, pdfName, pdfNum } from "./objects.js";
|
|
2
|
+
import { concatBytes } from "./bytes/writer.js";
|
|
3
|
+
import { aesCbcEncrypt } from "./crypto/aes.js";
|
|
4
|
+
import { md5 } from "./crypto/md5.js";
|
|
5
|
+
import { rc4 } from "./crypto/rc4.js";
|
|
6
|
+
import { PASSWORD_PADDING, ZERO_IV, computeLegacyFileKeyFromPaddedPassword, hardenedHash, legacyUserValueCore, objectKey, padOrTruncatePassword, permissionsBytes } from "./encrypt.js";
|
|
7
|
+
import { randomBytes } from "./crypto/random.js";
|
|
8
|
+
//#region src/encrypt-write.ts
|
|
9
|
+
var PdfEncryptionError = class extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "PdfEncryptionError";
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const RC4_128_KEY_BYTES = 16;
|
|
16
|
+
const R6_PASSWORD_MAX_BYTES = 127;
|
|
17
|
+
const RESERVED_BIT_7_AND_8 = 192;
|
|
18
|
+
const DEPRECATED_ALWAYS_ONE_BIT_10 = 512;
|
|
19
|
+
const SCHEME_SPECS = {
|
|
20
|
+
"rc4-40": {
|
|
21
|
+
v: 1,
|
|
22
|
+
r: 2,
|
|
23
|
+
keyBytes: 5,
|
|
24
|
+
method: "rc4"
|
|
25
|
+
},
|
|
26
|
+
"rc4-128": {
|
|
27
|
+
v: 2,
|
|
28
|
+
r: 3,
|
|
29
|
+
keyBytes: RC4_128_KEY_BYTES,
|
|
30
|
+
method: "rc4"
|
|
31
|
+
},
|
|
32
|
+
"aes-128": {
|
|
33
|
+
v: 4,
|
|
34
|
+
r: 4,
|
|
35
|
+
keyBytes: 16,
|
|
36
|
+
method: "aes"
|
|
37
|
+
},
|
|
38
|
+
"aes-256": {
|
|
39
|
+
v: 5,
|
|
40
|
+
r: 6,
|
|
41
|
+
keyBytes: 32,
|
|
42
|
+
method: "aes"
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
function legacyPasswordBytes(password) {
|
|
46
|
+
const bytes = new Uint8Array(password.length);
|
|
47
|
+
for (let i = 0; i < password.length; i++) {
|
|
48
|
+
const code = password.charCodeAt(i);
|
|
49
|
+
if (code > 127) throw new PdfEncryptionError(`password contains character code ${String(code)}, outside the printable-ASCII range this writer supports for the rc4-40/rc4-128/aes-128 schemes; use a plain-ASCII password, or the aes-256 scheme, whose revision-6 passwords are Unicode`);
|
|
50
|
+
bytes[i] = code;
|
|
51
|
+
}
|
|
52
|
+
return bytes;
|
|
53
|
+
}
|
|
54
|
+
function r6PasswordBytes(password) {
|
|
55
|
+
return new TextEncoder().encode(password.normalize("NFKC")).subarray(0, R6_PASSWORD_MAX_BYTES);
|
|
56
|
+
}
|
|
57
|
+
function permissionsToP(permissions) {
|
|
58
|
+
let p = 0;
|
|
59
|
+
if (permissions?.print ?? true) p |= 4;
|
|
60
|
+
if (permissions?.modifyContents ?? true) p |= 8;
|
|
61
|
+
if (permissions?.copy ?? true) p |= 16;
|
|
62
|
+
if (permissions?.annotate ?? true) p |= 32;
|
|
63
|
+
p |= RESERVED_BIT_7_AND_8;
|
|
64
|
+
if (permissions?.fillForms ?? true) p |= 256;
|
|
65
|
+
p |= DEPRECATED_ALWAYS_ONE_BIT_10;
|
|
66
|
+
if (permissions?.assemble ?? true) p |= 1024;
|
|
67
|
+
if (permissions?.printHighRes ?? true) p |= 2048;
|
|
68
|
+
for (let bit = 13; bit <= 32; bit++) p |= 1 << bit - 1;
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
function computeLegacyOwnerValue(ownerPassword, userPassword, revision, keyBytes) {
|
|
72
|
+
let digest = md5(padOrTruncatePassword(ownerPassword));
|
|
73
|
+
if (revision >= 3) for (let i = 0; i < 50; i++) digest = md5(digest);
|
|
74
|
+
const ownerKey = digest.subarray(0, keyBytes);
|
|
75
|
+
let value = rc4(ownerKey, padOrTruncatePassword(userPassword));
|
|
76
|
+
if (revision >= 3) for (let i = 1; i <= 19; i++) {
|
|
77
|
+
const roundKey = Uint8Array.from(ownerKey, (byte) => byte ^ i);
|
|
78
|
+
value = rc4(roundKey, value);
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
function computeLegacyUserValue(fileKey, fileId, revision) {
|
|
83
|
+
const core = legacyUserValueCore(fileKey, fileId, revision);
|
|
84
|
+
if (revision === 2) return core;
|
|
85
|
+
return concatBytes([core, randomBytes(PASSWORD_PADDING.length - core.length)]);
|
|
86
|
+
}
|
|
87
|
+
function encryptAes(key, data) {
|
|
88
|
+
const iv = randomBytes(16);
|
|
89
|
+
const padLength = 16 - data.length % 16;
|
|
90
|
+
const padded = new Uint8Array(data.length + padLength);
|
|
91
|
+
padded.set(data);
|
|
92
|
+
padded.fill(padLength, data.length);
|
|
93
|
+
return concatBytes([iv, aesCbcEncrypt(key, iv, padded)]);
|
|
94
|
+
}
|
|
95
|
+
function applyEncryptMethod(method, fileKey, perObjectKeys, bytes, num, gen) {
|
|
96
|
+
if (method === "identity") return bytes;
|
|
97
|
+
const key = perObjectKeys ? objectKey(fileKey, num, gen, method) : fileKey;
|
|
98
|
+
return method === "rc4" ? rc4(key, bytes) : encryptAes(key, bytes);
|
|
99
|
+
}
|
|
100
|
+
function buildEncryptor(encryptDict, fileKey, method, perObjectKeys, encryptMetadata) {
|
|
101
|
+
return {
|
|
102
|
+
encryptDict,
|
|
103
|
+
encryptString(bytes, num, gen) {
|
|
104
|
+
return applyEncryptMethod(method, fileKey, perObjectKeys, bytes, num, gen);
|
|
105
|
+
},
|
|
106
|
+
encryptStream(bytes, dict, num, gen) {
|
|
107
|
+
const type = dict.entries.get("Type");
|
|
108
|
+
if (!encryptMetadata && type?.kind === "name" && type.name === "Metadata") return bytes;
|
|
109
|
+
return applyEncryptMethod(method, fileKey, perObjectKeys, bytes, num, gen);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function buildLegacyEncryptor(spec, options, fileId) {
|
|
114
|
+
const userPassword = legacyPasswordBytes(options.userPassword ?? "");
|
|
115
|
+
const ownerPassword = legacyPasswordBytes(options.ownerPassword ?? options.userPassword ?? "");
|
|
116
|
+
const encryptMetadata = options.encryptMetadata ?? true;
|
|
117
|
+
const p = permissionsToP(options.permissions);
|
|
118
|
+
const owner = computeLegacyOwnerValue(ownerPassword, userPassword, spec.r, spec.keyBytes);
|
|
119
|
+
const fileKey = computeLegacyFileKeyFromPaddedPassword(padOrTruncatePassword(userPassword), owner, p, fileId, spec.r, spec.keyBytes, encryptMetadata);
|
|
120
|
+
const user = computeLegacyUserValue(fileKey, fileId, spec.r);
|
|
121
|
+
const entries = /* @__PURE__ */ new Map([
|
|
122
|
+
["Filter", pdfName("Standard")],
|
|
123
|
+
["V", pdfNum(spec.v)],
|
|
124
|
+
["R", pdfNum(spec.r)],
|
|
125
|
+
["O", pdfHexString(owner)],
|
|
126
|
+
["U", pdfHexString(user)],
|
|
127
|
+
["P", pdfNum(p)],
|
|
128
|
+
["Length", pdfNum(spec.keyBytes * 8)]
|
|
129
|
+
]);
|
|
130
|
+
if (spec.v === 4) {
|
|
131
|
+
entries.set("CF", pdfDict({ StdCF: pdfDict({
|
|
132
|
+
AuthEvent: pdfName("DocOpen"),
|
|
133
|
+
CFM: pdfName("AESV2"),
|
|
134
|
+
Length: pdfNum(spec.keyBytes)
|
|
135
|
+
}) }));
|
|
136
|
+
entries.set("StmF", pdfName("StdCF"));
|
|
137
|
+
entries.set("StrF", pdfName("StdCF"));
|
|
138
|
+
entries.set("EncryptMetadata", pdfBool(encryptMetadata));
|
|
139
|
+
}
|
|
140
|
+
return buildEncryptor(pdfDict(entries), fileKey, spec.method, true, encryptMetadata);
|
|
141
|
+
}
|
|
142
|
+
function buildAes256Encryptor(spec, options) {
|
|
143
|
+
const userPassword = r6PasswordBytes(options.userPassword ?? "");
|
|
144
|
+
const ownerPassword = r6PasswordBytes(options.ownerPassword ?? options.userPassword ?? "");
|
|
145
|
+
const encryptMetadata = options.encryptMetadata ?? true;
|
|
146
|
+
const p = permissionsToP(options.permissions);
|
|
147
|
+
const fileKey = randomBytes(32);
|
|
148
|
+
const userValidationSalt = randomBytes(8);
|
|
149
|
+
const userKeySalt = randomBytes(8);
|
|
150
|
+
const empty = /* @__PURE__ */ new Uint8Array(0);
|
|
151
|
+
const userHash = hardenedHash(userPassword, userValidationSalt, empty, spec.r);
|
|
152
|
+
const u = concatBytes([
|
|
153
|
+
userHash,
|
|
154
|
+
userValidationSalt,
|
|
155
|
+
userKeySalt
|
|
156
|
+
]);
|
|
157
|
+
const userIntermediateKey = hardenedHash(userPassword, userKeySalt, empty, spec.r);
|
|
158
|
+
const ue = aesCbcEncrypt(userIntermediateKey, ZERO_IV, fileKey);
|
|
159
|
+
const ownerValidationSalt = randomBytes(8);
|
|
160
|
+
const ownerKeySalt = randomBytes(8);
|
|
161
|
+
const ownerHash = hardenedHash(ownerPassword, ownerValidationSalt, u, spec.r);
|
|
162
|
+
const o = concatBytes([
|
|
163
|
+
ownerHash,
|
|
164
|
+
ownerValidationSalt,
|
|
165
|
+
ownerKeySalt
|
|
166
|
+
]);
|
|
167
|
+
const ownerIntermediateKey = hardenedHash(ownerPassword, ownerKeySalt, u, spec.r);
|
|
168
|
+
const oe = aesCbcEncrypt(ownerIntermediateKey, ZERO_IV, fileKey);
|
|
169
|
+
const permsBlock = /* @__PURE__ */ new Uint8Array(16);
|
|
170
|
+
permsBlock.set(permissionsBytes(p), 0);
|
|
171
|
+
permsBlock.set([
|
|
172
|
+
255,
|
|
173
|
+
255,
|
|
174
|
+
255,
|
|
175
|
+
255
|
|
176
|
+
], 4);
|
|
177
|
+
permsBlock[8] = encryptMetadata ? 84 : 70;
|
|
178
|
+
permsBlock.set([
|
|
179
|
+
97,
|
|
180
|
+
100,
|
|
181
|
+
98
|
|
182
|
+
], 9);
|
|
183
|
+
permsBlock.set(randomBytes(4), 12);
|
|
184
|
+
const perms = aesCbcEncrypt(fileKey, ZERO_IV, permsBlock);
|
|
185
|
+
const entries = /* @__PURE__ */ new Map([
|
|
186
|
+
["Filter", pdfName("Standard")],
|
|
187
|
+
["V", pdfNum(spec.v)],
|
|
188
|
+
["R", pdfNum(spec.r)],
|
|
189
|
+
["O", pdfHexString(o)],
|
|
190
|
+
["U", pdfHexString(u)],
|
|
191
|
+
["OE", pdfHexString(oe)],
|
|
192
|
+
["UE", pdfHexString(ue)],
|
|
193
|
+
["P", pdfNum(p)],
|
|
194
|
+
["Perms", pdfHexString(perms)],
|
|
195
|
+
["Length", pdfNum(spec.keyBytes * 8)],
|
|
196
|
+
["CF", pdfDict({ StdCF: pdfDict({
|
|
197
|
+
AuthEvent: pdfName("DocOpen"),
|
|
198
|
+
CFM: pdfName("AESV3"),
|
|
199
|
+
Length: pdfNum(spec.keyBytes)
|
|
200
|
+
}) })],
|
|
201
|
+
["StmF", pdfName("StdCF")],
|
|
202
|
+
["StrF", pdfName("StdCF")],
|
|
203
|
+
["EncryptMetadata", pdfBool(encryptMetadata)]
|
|
204
|
+
]);
|
|
205
|
+
return buildEncryptor(pdfDict(entries), fileKey, spec.method, false, encryptMetadata);
|
|
206
|
+
}
|
|
207
|
+
function createStandardEncryptor(options, fileId) {
|
|
208
|
+
const scheme = options.scheme ?? "aes-256";
|
|
209
|
+
const spec = SCHEME_SPECS[scheme];
|
|
210
|
+
return spec.v === 5 ? buildAes256Encryptor(spec, options) : buildLegacyEncryptor(spec, options, fileId);
|
|
211
|
+
}
|
|
212
|
+
function encryptIndirectObject(value, num, gen, encryptor) {
|
|
213
|
+
if (value.kind === "string") return {
|
|
214
|
+
kind: "string",
|
|
215
|
+
bytes: encryptor.encryptString(value.bytes, num, gen),
|
|
216
|
+
hex: value.hex
|
|
217
|
+
};
|
|
218
|
+
if (value.kind === "array") return pdfArray(value.items.map((item) => encryptIndirectObject(item, num, gen, encryptor)));
|
|
219
|
+
if (value.kind === "dict") return encryptDictEntries(value, num, gen, encryptor);
|
|
220
|
+
if (value.kind === "stream") return {
|
|
221
|
+
kind: "stream",
|
|
222
|
+
dict: encryptDictEntries(value.dict, num, gen, encryptor),
|
|
223
|
+
raw: encryptor.encryptStream(value.raw, value.dict, num, gen)
|
|
224
|
+
};
|
|
225
|
+
return value;
|
|
226
|
+
}
|
|
227
|
+
function encryptDictEntries(dict, num, gen, encryptor) {
|
|
228
|
+
return pdfDict(new Map(Array.from(dict.entries, ([key, entry]) => [key, encryptIndirectObject(entry, num, gen, encryptor)])));
|
|
229
|
+
}
|
|
230
|
+
//#endregion
|
|
231
|
+
export { PdfEncryptionError, createStandardEncryptor, encryptIndirectObject };
|