pdf-parser.js 5.2.27 → 5.2.28
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/dist/{afm-widths-BYiX2L9D.cjs → afm-widths-BHD2HZIL.cjs} +553 -642
- package/dist/{afm-widths-blUDDjlI.js → afm-widths-B_IGbGky.js} +553 -642
- package/dist/afm-widths.cjs +1 -1
- package/dist/afm-widths.js +1 -1
- package/dist/annotations.cjs +5 -3
- package/dist/annotations.js +5 -3
- package/dist/builtin-encoding.cjs +17 -6
- package/dist/builtin-encoding.js +17 -6
- package/dist/bytes/crc32.cjs +5 -3
- package/dist/bytes/crc32.js +5 -3
- package/dist/bytes/flate.cjs +0 -1
- package/dist/bytes/flate.js +0 -1
- package/dist/cff-bounds.cjs +42 -24
- package/dist/cff-bounds.js +42 -24
- package/dist/cff.cjs +13 -6
- package/dist/cff.js +13 -6
- package/dist/cmap-table.cjs +54 -26
- package/dist/cmap-table.js +54 -26
- package/dist/cmap.cjs +5 -3
- package/dist/cmap.js +5 -3
- package/dist/content-write.cjs +3 -2
- package/dist/content-write.js +3 -2
- package/dist/crypto/aes.cjs +76 -55
- package/dist/crypto/aes.js +76 -55
- package/dist/crypto/md5.cjs +345 -149
- package/dist/crypto/md5.js +345 -149
- package/dist/crypto/rc4.cjs +5 -4
- package/dist/crypto/rc4.js +5 -4
- package/dist/crypto/sha2.cjs +92 -43
- package/dist/crypto/sha2.js +92 -43
- package/dist/embedded-font.cjs +4 -2
- package/dist/embedded-font.js +4 -2
- package/dist/encoding.cjs +1 -1
- package/dist/encoding.js +1 -1
- package/dist/encrypt-write.cjs +25 -21
- package/dist/encrypt-write.js +25 -21
- package/dist/encrypt.cjs +43 -64
- package/dist/encrypt.js +43 -64
- package/dist/filters.cjs +40 -20
- package/dist/filters.js +40 -20
- package/dist/font-face.cjs +2 -1
- package/dist/font-face.js +2 -1
- package/dist/font-read.cjs +12 -6
- package/dist/font-read.js +12 -6
- package/dist/font-tables.cjs +55 -28
- package/dist/font-tables.js +55 -28
- package/dist/gdef-table.cjs +6 -3
- package/dist/gdef-table.js +6 -3
- package/dist/glyf-contours.cjs +3 -1
- package/dist/glyf-contours.js +3 -1
- package/dist/glyf.cjs +22 -11
- package/dist/glyf.js +22 -11
- package/dist/gpos-table.cjs +37 -19
- package/dist/gpos-table.js +37 -19
- package/dist/gsub-table.cjs +28 -17
- package/dist/gsub-table.js +28 -17
- package/dist/hmtx-table.cjs +5 -3
- package/dist/hmtx-table.js +5 -3
- package/dist/image/ccitt-encode.cjs +8 -5
- package/dist/image/ccitt-encode.js +8 -5
- package/dist/image/ccitt.cjs +801 -209
- package/dist/image/ccitt.js +801 -209
- package/dist/image/jbig2-arith.cjs +340 -306
- package/dist/image/jbig2-arith.js +340 -306
- package/dist/image/jbig2-bitmap.cjs +8 -5
- package/dist/image/jbig2-bitmap.js +8 -5
- package/dist/image/jbig2-generic.cjs +240 -69
- package/dist/image/jbig2-generic.js +240 -69
- package/dist/image/jbig2-text.cjs +4 -2
- package/dist/image/jbig2-text.js +4 -2
- package/dist/image/jbig2.cjs +69 -31
- package/dist/image/jbig2.js +69 -31
- package/dist/image/jp2-boxes.cjs +52 -27
- package/dist/image/jp2-boxes.js +52 -27
- package/dist/image/jpeg-info.cjs +29 -24
- package/dist/image/jpeg-info.js +29 -24
- package/dist/image/jpeg2000-codestream.cjs +44 -24
- package/dist/image/jpeg2000-codestream.js +44 -24
- package/dist/image/jpeg2000-dwt.cjs +2 -1
- package/dist/image/jpeg2000-dwt.js +2 -1
- package/dist/image/jpeg2000-t1.cjs +21 -11
- package/dist/image/jpeg2000-t1.js +21 -11
- package/dist/image/jpeg2000-t2.cjs +12 -5
- package/dist/image/jpeg2000-t2.js +12 -5
- package/dist/image/jpeg2000-tagtree.cjs +8 -4
- package/dist/image/jpeg2000-tagtree.js +8 -4
- package/dist/image/jpeg2000.cjs +11 -6
- package/dist/image/jpeg2000.js +11 -6
- package/dist/image/png-decode.cjs +62 -39
- package/dist/image/png-decode.d.cts +3 -2
- package/dist/image/png-decode.d.ts +3 -2
- package/dist/image/png-decode.js +62 -39
- package/dist/image/png-filter.cjs +23 -15
- package/dist/image/png-filter.js +23 -15
- package/dist/images-read.cjs +41 -36
- package/dist/images-read.js +41 -36
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/interpret.cjs +39 -24
- package/dist/interpret.js +39 -24
- package/dist/lexer.cjs +86 -51
- package/dist/lexer.js +86 -51
- package/dist/math-content-write.cjs +9 -5
- package/dist/math-content-write.js +9 -5
- package/dist/math-font-write.cjs +2 -1
- package/dist/math-font-write.js +2 -1
- package/dist/math-font.cjs +16 -7
- package/dist/math-font.js +16 -7
- package/dist/math-table.cjs +25 -13
- package/dist/math-table.js +25 -13
- package/dist/matrix.cjs +3 -2
- package/dist/matrix.js +3 -2
- package/dist/measure.cjs +1 -1
- package/dist/measure.js +1 -1
- package/dist/navigation.cjs +10 -5
- package/dist/navigation.js +10 -5
- package/dist/ot-layout-common.cjs +4 -2
- package/dist/ot-layout-common.js +4 -2
- package/dist/parse.cjs +7 -5
- package/dist/parse.js +7 -5
- package/dist/pdf-text.cjs +5 -2
- package/dist/pdf-text.js +5 -2
- package/dist/predictors.cjs +14 -9
- package/dist/predictors.js +14 -9
- package/dist/raster.cjs +30 -19
- package/dist/raster.js +30 -19
- package/dist/read.cjs +17 -8
- package/dist/read.js +17 -8
- package/dist/serialize.cjs +6 -2
- package/dist/serialize.js +6 -2
- package/dist/sfnt-subset.cjs +25 -13
- package/dist/sfnt-subset.js +25 -13
- package/dist/sfnt.cjs +20 -10
- package/dist/sfnt.js +20 -10
- package/dist/text-group.cjs +0 -1
- package/dist/text-group.js +0 -1
- package/dist/tounicode.cjs +4 -2
- package/dist/tounicode.js +4 -2
- package/dist/winansi.cjs +1 -1
- package/dist/winansi.js +1 -1
- package/dist/write.cjs +20 -12
- package/dist/write.js +20 -12
- package/dist/xref.cjs +5 -2
- package/dist/xref.js +5 -2
- package/package.json +1 -1
package/dist/sfnt-subset.js
CHANGED
|
@@ -20,6 +20,13 @@ const LEFT_SIDE_BEARING_SIZE = 2;
|
|
|
20
20
|
const LOCA_LONG_ENTRY_SIZE = 4;
|
|
21
21
|
const TABLE_DIRECTORY_HEADER_SIZE = 12;
|
|
22
22
|
const TABLE_RECORD_SIZE = 16;
|
|
23
|
+
const SFNT_HEADER_NUM_TABLES_OFFSET = 4;
|
|
24
|
+
const SFNT_HEADER_SEARCH_RANGE_OFFSET = 6;
|
|
25
|
+
const SFNT_HEADER_ENTRY_SELECTOR_OFFSET = 8;
|
|
26
|
+
const SFNT_HEADER_RANGE_SHIFT_OFFSET = 10;
|
|
27
|
+
const TABLE_RECORD_CHECKSUM_OFFSET = 4;
|
|
28
|
+
const TABLE_RECORD_TABLE_OFFSET_OFFSET = 8;
|
|
29
|
+
const TABLE_RECORD_LENGTH_OFFSET = 12;
|
|
23
30
|
const SFNT_VERSION_TRUETYPE = 65536;
|
|
24
31
|
const CHECKSUM_ADJUSTMENT_MAGIC = 2981146554;
|
|
25
32
|
const GLYPH_ALIGNMENT = 4;
|
|
@@ -31,15 +38,20 @@ const COPIED_TAGS = [
|
|
|
31
38
|
function alignUp(value) {
|
|
32
39
|
return Math.ceil(value / GLYPH_ALIGNMENT) * GLYPH_ALIGNMENT;
|
|
33
40
|
}
|
|
41
|
+
const BITS_PER_BYTE = 8;
|
|
42
|
+
const BYTE_MASK = 255;
|
|
43
|
+
const U32_BYTE_2_SHIFT = 16;
|
|
44
|
+
const U32_BYTE_1_SHIFT = 24;
|
|
45
|
+
const U32_LAST_BYTE_OFFSET = 3;
|
|
34
46
|
function writeU16(bytes, offset, value) {
|
|
35
|
-
bytes[offset] = value >>>
|
|
36
|
-
bytes[offset + 1] = value &
|
|
47
|
+
bytes[offset] = value >>> BITS_PER_BYTE & BYTE_MASK;
|
|
48
|
+
bytes[offset + 1] = value & BYTE_MASK;
|
|
37
49
|
}
|
|
38
50
|
function writeU32(bytes, offset, value) {
|
|
39
|
-
bytes[offset] = value >>>
|
|
40
|
-
bytes[offset + 1] = value >>>
|
|
41
|
-
bytes[offset + 2] = value >>>
|
|
42
|
-
bytes[offset +
|
|
51
|
+
bytes[offset] = value >>> U32_BYTE_1_SHIFT & BYTE_MASK;
|
|
52
|
+
bytes[offset + 1] = value >>> U32_BYTE_2_SHIFT & BYTE_MASK;
|
|
53
|
+
bytes[offset + 2] = value >>> BITS_PER_BYTE & BYTE_MASK;
|
|
54
|
+
bytes[offset + U32_LAST_BYTE_OFFSET] = value & BYTE_MASK;
|
|
43
55
|
}
|
|
44
56
|
function checksum(bytes, offset, length) {
|
|
45
57
|
let sum = 0;
|
|
@@ -229,19 +241,19 @@ function subsetSfnt(font, codePoints, extraGlyphIds = []) {
|
|
|
229
241
|
}
|
|
230
242
|
const file = new Uint8Array(fileLength);
|
|
231
243
|
writeU32(file, 0, SFNT_VERSION_TRUETYPE);
|
|
232
|
-
writeU16(file,
|
|
233
|
-
writeU16(file,
|
|
234
|
-
writeU16(file,
|
|
235
|
-
writeU16(file,
|
|
244
|
+
writeU16(file, SFNT_HEADER_NUM_TABLES_OFFSET, numTables);
|
|
245
|
+
writeU16(file, SFNT_HEADER_SEARCH_RANGE_OFFSET, searchRange);
|
|
246
|
+
writeU16(file, SFNT_HEADER_ENTRY_SELECTOR_OFFSET, entrySelector);
|
|
247
|
+
writeU16(file, SFNT_HEADER_RANGE_SHIFT_OFFSET, rangeShift);
|
|
236
248
|
for (let i = 0; i < numTables; i++) {
|
|
237
249
|
const table = tables[i];
|
|
238
250
|
const tableOffset = offsets[i];
|
|
239
251
|
file.set(table.data, tableOffset);
|
|
240
252
|
const recordOffset = TABLE_DIRECTORY_HEADER_SIZE + i * TABLE_RECORD_SIZE;
|
|
241
253
|
for (let c = 0; c < table.tag.length; c++) file[recordOffset + c] = table.tag.charCodeAt(c);
|
|
242
|
-
writeU32(file, recordOffset +
|
|
243
|
-
writeU32(file, recordOffset +
|
|
244
|
-
writeU32(file, recordOffset +
|
|
254
|
+
writeU32(file, recordOffset + TABLE_RECORD_CHECKSUM_OFFSET, checksum(file, tableOffset, alignUp(table.data.length)));
|
|
255
|
+
writeU32(file, recordOffset + TABLE_RECORD_TABLE_OFFSET_OFFSET, tableOffset);
|
|
256
|
+
writeU32(file, recordOffset + TABLE_RECORD_LENGTH_OFFSET, table.data.length);
|
|
245
257
|
}
|
|
246
258
|
const headOffsetInFile = offsets[tables.findIndex((table) => table.tag === "head")];
|
|
247
259
|
writeU32(file, headOffsetInFile + HEAD_CHECKSUM_ADJUSTMENT_OFFSET, CHECKSUM_ADJUSTMENT_MAGIC - checksum(file, 0, fileLength) >>> 0);
|
package/dist/sfnt.cjs
CHANGED
|
@@ -3,6 +3,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const TABLE_DIRECTORY_HEADER_SIZE = 12;
|
|
4
4
|
const TABLE_RECORD_SIZE = 16;
|
|
5
5
|
const TABLE_TAG_SIZE = 4;
|
|
6
|
+
const BITS_PER_BYTE = 8;
|
|
7
|
+
const UINT32_BYTE_COUNT = 4;
|
|
8
|
+
const TABLE_DIRECTORY_NUM_TABLES_FIELD = 4;
|
|
9
|
+
const TABLE_RECORD_OFFSET_FIELD = 8;
|
|
10
|
+
const TABLE_RECORD_LENGTH_FIELD = 12;
|
|
11
|
+
const PRINTABLE_ASCII_MIN = 32;
|
|
12
|
+
const PRINTABLE_ASCII_MAX = 126;
|
|
6
13
|
const SFNT_VERSIONS = /* @__PURE__ */ new Set([
|
|
7
14
|
65536,
|
|
8
15
|
1330926671,
|
|
@@ -16,16 +23,16 @@ function requireBytes(bytes, offset, length) {
|
|
|
16
23
|
if (!hasBytes(bytes, offset, length)) throw new Error(`sfnt read of ${String(length)} byte(s) at offset ${String(offset)} is outside the ${String(bytes.length)}-byte range`);
|
|
17
24
|
}
|
|
18
25
|
function readUint16(bytes, offset) {
|
|
19
|
-
return bytes[offset] <<
|
|
26
|
+
return bytes[offset] << BITS_PER_BYTE | bytes[offset + 1];
|
|
20
27
|
}
|
|
21
28
|
function readUint32(bytes, offset) {
|
|
22
|
-
return (bytes[offset] << 24 | bytes[offset + 1] << 16 | bytes[offset + 2] <<
|
|
29
|
+
return (bytes[offset] << 24 | bytes[offset + 1] << 16 | bytes[offset + 2] << BITS_PER_BYTE | bytes[offset + 3]) >>> 0;
|
|
23
30
|
}
|
|
24
31
|
function decodeTag(bytes, offset) {
|
|
25
32
|
let tag = "";
|
|
26
33
|
for (let i = 0; i < TABLE_TAG_SIZE; i++) {
|
|
27
34
|
const byte = bytes[offset + i];
|
|
28
|
-
if (byte <
|
|
35
|
+
if (byte < PRINTABLE_ASCII_MIN || byte > PRINTABLE_ASCII_MAX) return;
|
|
29
36
|
tag += String.fromCharCode(byte);
|
|
30
37
|
}
|
|
31
38
|
return tag;
|
|
@@ -33,15 +40,15 @@ function decodeTag(bytes, offset) {
|
|
|
33
40
|
function parseSfnt(bytes) {
|
|
34
41
|
if (!hasBytes(bytes, 0, TABLE_DIRECTORY_HEADER_SIZE)) return;
|
|
35
42
|
if (!SFNT_VERSIONS.has(readUint32(bytes, 0))) return;
|
|
36
|
-
const numTables = readUint16(bytes,
|
|
43
|
+
const numTables = readUint16(bytes, TABLE_DIRECTORY_NUM_TABLES_FIELD);
|
|
37
44
|
if (!hasBytes(bytes, 0, TABLE_DIRECTORY_HEADER_SIZE + numTables * TABLE_RECORD_SIZE)) return;
|
|
38
45
|
const tables = /* @__PURE__ */ new Map();
|
|
39
46
|
for (let i = 0; i < numTables; i++) {
|
|
40
47
|
const recordOffset = TABLE_DIRECTORY_HEADER_SIZE + i * TABLE_RECORD_SIZE;
|
|
41
48
|
const tag = decodeTag(bytes, recordOffset);
|
|
42
49
|
if (tag === void 0) return;
|
|
43
|
-
const offset = readUint32(bytes, recordOffset +
|
|
44
|
-
const length = readUint32(bytes, recordOffset +
|
|
50
|
+
const offset = readUint32(bytes, recordOffset + TABLE_RECORD_OFFSET_FIELD);
|
|
51
|
+
const length = readUint32(bytes, recordOffset + TABLE_RECORD_LENGTH_FIELD);
|
|
45
52
|
if (!hasBytes(bytes, offset, length)) continue;
|
|
46
53
|
if (tables.has(tag)) continue;
|
|
47
54
|
tables.set(tag, {
|
|
@@ -66,16 +73,19 @@ function u16(bytes, offset) {
|
|
|
66
73
|
requireBytes(bytes, offset, 2);
|
|
67
74
|
return readUint16(bytes, offset);
|
|
68
75
|
}
|
|
76
|
+
const INT16_SIGN_BIT = 32768;
|
|
77
|
+
const UINT16_MODULUS = 65536;
|
|
69
78
|
function i16(bytes, offset) {
|
|
70
79
|
const value = u16(bytes, offset);
|
|
71
|
-
return value >=
|
|
80
|
+
return value >= INT16_SIGN_BIT ? value - UINT16_MODULUS : value;
|
|
72
81
|
}
|
|
82
|
+
const UINT24_BYTE_COUNT = 3;
|
|
73
83
|
function u24(bytes, offset) {
|
|
74
|
-
requireBytes(bytes, offset,
|
|
75
|
-
return bytes[offset] << 16 | bytes[offset + 1] <<
|
|
84
|
+
requireBytes(bytes, offset, UINT24_BYTE_COUNT);
|
|
85
|
+
return bytes[offset] << 16 | bytes[offset + 1] << BITS_PER_BYTE | bytes[offset + 2];
|
|
76
86
|
}
|
|
77
87
|
function u32(bytes, offset) {
|
|
78
|
-
requireBytes(bytes, offset,
|
|
88
|
+
requireBytes(bytes, offset, UINT32_BYTE_COUNT);
|
|
79
89
|
return readUint32(bytes, offset);
|
|
80
90
|
}
|
|
81
91
|
function i32(bytes, offset) {
|
package/dist/sfnt.js
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
const TABLE_DIRECTORY_HEADER_SIZE = 12;
|
|
3
3
|
const TABLE_RECORD_SIZE = 16;
|
|
4
4
|
const TABLE_TAG_SIZE = 4;
|
|
5
|
+
const BITS_PER_BYTE = 8;
|
|
6
|
+
const UINT32_BYTE_COUNT = 4;
|
|
7
|
+
const TABLE_DIRECTORY_NUM_TABLES_FIELD = 4;
|
|
8
|
+
const TABLE_RECORD_OFFSET_FIELD = 8;
|
|
9
|
+
const TABLE_RECORD_LENGTH_FIELD = 12;
|
|
10
|
+
const PRINTABLE_ASCII_MIN = 32;
|
|
11
|
+
const PRINTABLE_ASCII_MAX = 126;
|
|
5
12
|
const SFNT_VERSIONS = /* @__PURE__ */ new Set([
|
|
6
13
|
65536,
|
|
7
14
|
1330926671,
|
|
@@ -15,16 +22,16 @@ function requireBytes(bytes, offset, length) {
|
|
|
15
22
|
if (!hasBytes(bytes, offset, length)) throw new Error(`sfnt read of ${String(length)} byte(s) at offset ${String(offset)} is outside the ${String(bytes.length)}-byte range`);
|
|
16
23
|
}
|
|
17
24
|
function readUint16(bytes, offset) {
|
|
18
|
-
return bytes[offset] <<
|
|
25
|
+
return bytes[offset] << BITS_PER_BYTE | bytes[offset + 1];
|
|
19
26
|
}
|
|
20
27
|
function readUint32(bytes, offset) {
|
|
21
|
-
return (bytes[offset] << 24 | bytes[offset + 1] << 16 | bytes[offset + 2] <<
|
|
28
|
+
return (bytes[offset] << 24 | bytes[offset + 1] << 16 | bytes[offset + 2] << BITS_PER_BYTE | bytes[offset + 3]) >>> 0;
|
|
22
29
|
}
|
|
23
30
|
function decodeTag(bytes, offset) {
|
|
24
31
|
let tag = "";
|
|
25
32
|
for (let i = 0; i < TABLE_TAG_SIZE; i++) {
|
|
26
33
|
const byte = bytes[offset + i];
|
|
27
|
-
if (byte <
|
|
34
|
+
if (byte < PRINTABLE_ASCII_MIN || byte > PRINTABLE_ASCII_MAX) return;
|
|
28
35
|
tag += String.fromCharCode(byte);
|
|
29
36
|
}
|
|
30
37
|
return tag;
|
|
@@ -32,15 +39,15 @@ function decodeTag(bytes, offset) {
|
|
|
32
39
|
function parseSfnt(bytes) {
|
|
33
40
|
if (!hasBytes(bytes, 0, TABLE_DIRECTORY_HEADER_SIZE)) return;
|
|
34
41
|
if (!SFNT_VERSIONS.has(readUint32(bytes, 0))) return;
|
|
35
|
-
const numTables = readUint16(bytes,
|
|
42
|
+
const numTables = readUint16(bytes, TABLE_DIRECTORY_NUM_TABLES_FIELD);
|
|
36
43
|
if (!hasBytes(bytes, 0, TABLE_DIRECTORY_HEADER_SIZE + numTables * TABLE_RECORD_SIZE)) return;
|
|
37
44
|
const tables = /* @__PURE__ */ new Map();
|
|
38
45
|
for (let i = 0; i < numTables; i++) {
|
|
39
46
|
const recordOffset = TABLE_DIRECTORY_HEADER_SIZE + i * TABLE_RECORD_SIZE;
|
|
40
47
|
const tag = decodeTag(bytes, recordOffset);
|
|
41
48
|
if (tag === void 0) return;
|
|
42
|
-
const offset = readUint32(bytes, recordOffset +
|
|
43
|
-
const length = readUint32(bytes, recordOffset +
|
|
49
|
+
const offset = readUint32(bytes, recordOffset + TABLE_RECORD_OFFSET_FIELD);
|
|
50
|
+
const length = readUint32(bytes, recordOffset + TABLE_RECORD_LENGTH_FIELD);
|
|
44
51
|
if (!hasBytes(bytes, offset, length)) continue;
|
|
45
52
|
if (tables.has(tag)) continue;
|
|
46
53
|
tables.set(tag, {
|
|
@@ -65,16 +72,19 @@ function u16(bytes, offset) {
|
|
|
65
72
|
requireBytes(bytes, offset, 2);
|
|
66
73
|
return readUint16(bytes, offset);
|
|
67
74
|
}
|
|
75
|
+
const INT16_SIGN_BIT = 32768;
|
|
76
|
+
const UINT16_MODULUS = 65536;
|
|
68
77
|
function i16(bytes, offset) {
|
|
69
78
|
const value = u16(bytes, offset);
|
|
70
|
-
return value >=
|
|
79
|
+
return value >= INT16_SIGN_BIT ? value - UINT16_MODULUS : value;
|
|
71
80
|
}
|
|
81
|
+
const UINT24_BYTE_COUNT = 3;
|
|
72
82
|
function u24(bytes, offset) {
|
|
73
|
-
requireBytes(bytes, offset,
|
|
74
|
-
return bytes[offset] << 16 | bytes[offset + 1] <<
|
|
83
|
+
requireBytes(bytes, offset, UINT24_BYTE_COUNT);
|
|
84
|
+
return bytes[offset] << 16 | bytes[offset + 1] << BITS_PER_BYTE | bytes[offset + 2];
|
|
75
85
|
}
|
|
76
86
|
function u32(bytes, offset) {
|
|
77
|
-
requireBytes(bytes, offset,
|
|
87
|
+
requireBytes(bytes, offset, UINT32_BYTE_COUNT);
|
|
78
88
|
return readUint32(bytes, offset);
|
|
79
89
|
}
|
|
80
90
|
function i32(bytes, offset) {
|
package/dist/text-group.cjs
CHANGED
package/dist/text-group.js
CHANGED
package/dist/tounicode.cjs
CHANGED
|
@@ -2,10 +2,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_objects = require("./objects.cjs");
|
|
3
3
|
//#region src/tounicode.ts
|
|
4
4
|
const MAX_BFCHAR_ENTRIES_PER_BLOCK = 100;
|
|
5
|
+
const HEX_RADIX = 16;
|
|
6
|
+
const UTF16_HEX_DIGIT_WIDTH = 4;
|
|
5
7
|
function codePointToUtf16BEHex(codePoint) {
|
|
6
8
|
const text = String.fromCodePoint(codePoint);
|
|
7
9
|
let hex = "";
|
|
8
|
-
for (let i = 0; i < text.length; i++) hex += text.charCodeAt(i).toString(
|
|
10
|
+
for (let i = 0; i < text.length; i++) hex += text.charCodeAt(i).toString(HEX_RADIX).padStart(UTF16_HEX_DIGIT_WIDTH, "0");
|
|
9
11
|
return hex;
|
|
10
12
|
}
|
|
11
13
|
function sequenceToUtf16BEHex(codePoints) {
|
|
@@ -29,7 +31,7 @@ function buildToUnicodeCMap(codeToSequence) {
|
|
|
29
31
|
for (let start = 0; start < entries.length; start += MAX_BFCHAR_ENTRIES_PER_BLOCK) {
|
|
30
32
|
const block = entries.slice(start, start + MAX_BFCHAR_ENTRIES_PER_BLOCK);
|
|
31
33
|
lines.push(`${block.length} beginbfchar`);
|
|
32
|
-
for (const [code, sequence] of block) lines.push(`<${code.toString(
|
|
34
|
+
for (const [code, sequence] of block) lines.push(`<${code.toString(HEX_RADIX).padStart(UTF16_HEX_DIGIT_WIDTH, "0")}> <${sequenceToUtf16BEHex(sequence)}>`);
|
|
33
35
|
lines.push("endbfchar");
|
|
34
36
|
}
|
|
35
37
|
lines.push("endcmap", "CMapName currentdict /CMap defineresource pop", "end", "end");
|
package/dist/tounicode.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { pdfDict, pdfStream } from "./objects.js";
|
|
2
2
|
//#region src/tounicode.ts
|
|
3
3
|
const MAX_BFCHAR_ENTRIES_PER_BLOCK = 100;
|
|
4
|
+
const HEX_RADIX = 16;
|
|
5
|
+
const UTF16_HEX_DIGIT_WIDTH = 4;
|
|
4
6
|
function codePointToUtf16BEHex(codePoint) {
|
|
5
7
|
const text = String.fromCodePoint(codePoint);
|
|
6
8
|
let hex = "";
|
|
7
|
-
for (let i = 0; i < text.length; i++) hex += text.charCodeAt(i).toString(
|
|
9
|
+
for (let i = 0; i < text.length; i++) hex += text.charCodeAt(i).toString(HEX_RADIX).padStart(UTF16_HEX_DIGIT_WIDTH, "0");
|
|
8
10
|
return hex;
|
|
9
11
|
}
|
|
10
12
|
function sequenceToUtf16BEHex(codePoints) {
|
|
@@ -28,7 +30,7 @@ function buildToUnicodeCMap(codeToSequence) {
|
|
|
28
30
|
for (let start = 0; start < entries.length; start += MAX_BFCHAR_ENTRIES_PER_BLOCK) {
|
|
29
31
|
const block = entries.slice(start, start + MAX_BFCHAR_ENTRIES_PER_BLOCK);
|
|
30
32
|
lines.push(`${block.length} beginbfchar`);
|
|
31
|
-
for (const [code, sequence] of block) lines.push(`<${code.toString(
|
|
33
|
+
for (const [code, sequence] of block) lines.push(`<${code.toString(HEX_RADIX).padStart(UTF16_HEX_DIGIT_WIDTH, "0")}> <${sequenceToUtf16BEHex(sequence)}>`);
|
|
32
34
|
lines.push("endbfchar");
|
|
33
35
|
}
|
|
34
36
|
lines.push("endcmap", "CMapName currentdict /CMap defineresource pop", "end", "end");
|
package/dist/winansi.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_afm_widths = require("./afm-widths-
|
|
2
|
+
const require_afm_widths = require("./afm-widths-BHD2HZIL.cjs");
|
|
3
3
|
exports.encodeForShow = require_afm_widths.encodeForShow;
|
|
4
4
|
exports.sanitizeToWinAnsi = require_afm_widths.sanitizeToWinAnsi;
|
|
5
5
|
exports.winAnsiCodeToUnicode = require_afm_widths.winAnsiCodeToUnicode;
|
package/dist/winansi.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as winAnsiCodeToUnicode, g as sanitizeToWinAnsi, h as encodeForShow } from "./afm-widths-
|
|
1
|
+
import { _ as winAnsiCodeToUnicode, g as sanitizeToWinAnsi, h as encodeForShow } from "./afm-widths-B_IGbGky.js";
|
|
2
2
|
export { encodeForShow, sanitizeToWinAnsi, winAnsiCodeToUnicode };
|
package/dist/write.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_afm_widths = require("./afm-widths-
|
|
2
|
+
const require_afm_widths = require("./afm-widths-BHD2HZIL.cjs");
|
|
3
3
|
const require_notes_annotation_author = require("./notes-annotation-author.cjs");
|
|
4
4
|
const require_objects = require("./objects.cjs");
|
|
5
5
|
const require_bytes_writer = require("./bytes/writer.cjs");
|
|
@@ -36,6 +36,11 @@ const FLAG_NONSYMBOLIC = 32;
|
|
|
36
36
|
const FLAG_ITALIC = 64;
|
|
37
37
|
const FLAG_FORCE_BOLD = 262144;
|
|
38
38
|
const FILE_ID_BYTES = 16;
|
|
39
|
+
const BITS_PER_BYTE = 8;
|
|
40
|
+
const BYTE_SHIFT = Math.log2(BITS_PER_BYTE);
|
|
41
|
+
const BYTE_MASK = 255;
|
|
42
|
+
const PACKED_BIT_MSB_MASK = 128;
|
|
43
|
+
const BIT_INDEX_MASK = 7;
|
|
39
44
|
function textToPdfString(text) {
|
|
40
45
|
const bytes = new Uint8Array(2 + text.length * 2);
|
|
41
46
|
bytes[0] = 254;
|
|
@@ -43,8 +48,8 @@ function textToPdfString(text) {
|
|
|
43
48
|
let offset = 2;
|
|
44
49
|
for (const unit of text.split("")) {
|
|
45
50
|
const code = unit.charCodeAt(0);
|
|
46
|
-
bytes[offset] = code >>
|
|
47
|
-
bytes[offset + 1] = code &
|
|
51
|
+
bytes[offset] = code >> BITS_PER_BYTE & BYTE_MASK;
|
|
52
|
+
bytes[offset + 1] = code & BYTE_MASK;
|
|
48
53
|
offset += 2;
|
|
49
54
|
}
|
|
50
55
|
return require_objects.pdfHexString(bytes);
|
|
@@ -108,9 +113,10 @@ function buildFontObjects(standardName, descriptorRef) {
|
|
|
108
113
|
function codePointsOf(texts) {
|
|
109
114
|
return new Set(texts.flatMap((text) => [...text].map((character) => character.codePointAt(0))));
|
|
110
115
|
}
|
|
116
|
+
const JPEG_COMPONENTS_CMYK = 4;
|
|
111
117
|
function prepareJpegImage(bytes) {
|
|
112
118
|
const info = require_image_jpeg_info.readJpegInfo(bytes);
|
|
113
|
-
const colorSpace = info.components === 1 ? "DeviceGray" : info.components ===
|
|
119
|
+
const colorSpace = info.components === 1 ? "DeviceGray" : info.components === JPEG_COMPONENTS_CMYK ? "DeviceCMYK" : "DeviceRGB";
|
|
114
120
|
const entries = /* @__PURE__ */ new Map([
|
|
115
121
|
["Type", require_objects.pdfName("XObject")],
|
|
116
122
|
["Subtype", require_objects.pdfName("Image")],
|
|
@@ -120,7 +126,7 @@ function prepareJpegImage(bytes) {
|
|
|
120
126
|
["BitsPerComponent", require_objects.pdfNum(info.precision)],
|
|
121
127
|
["Filter", require_objects.pdfName("DCTDecode")]
|
|
122
128
|
]);
|
|
123
|
-
if (info.components ===
|
|
129
|
+
if (info.components === JPEG_COMPONENTS_CMYK && (info.adobeTransform === 2 || info.adobeTransform === void 0)) entries.set("Decode", require_objects.pdfArray([
|
|
124
130
|
1,
|
|
125
131
|
0,
|
|
126
132
|
1,
|
|
@@ -142,22 +148,22 @@ function pngImageDict(width, height, colorSpace, compress) {
|
|
|
142
148
|
["Width", require_objects.pdfNum(width)],
|
|
143
149
|
["Height", require_objects.pdfNum(height)],
|
|
144
150
|
["ColorSpace", require_objects.pdfName(colorSpace)],
|
|
145
|
-
["BitsPerComponent", require_objects.pdfNum(
|
|
151
|
+
["BitsPerComponent", require_objects.pdfNum(BITS_PER_BYTE)]
|
|
146
152
|
]);
|
|
147
153
|
if (compress) entries.set("Filter", require_objects.pdfName("FlateDecode"));
|
|
148
154
|
return require_objects.pdfDict(entries);
|
|
149
155
|
}
|
|
150
156
|
function packBilevel(raw) {
|
|
151
|
-
const rowBytes = raw.width +
|
|
157
|
+
const rowBytes = raw.width + BIT_INDEX_MASK >> BYTE_SHIFT;
|
|
152
158
|
const packed = new Uint8Array(rowBytes * raw.height);
|
|
153
159
|
const view = new DataView(packed.buffer);
|
|
154
160
|
for (let index = 0; index < raw.data.length; index++) {
|
|
155
161
|
const sample = raw.data[index];
|
|
156
|
-
if (sample !== 0 && sample !==
|
|
157
|
-
if (sample ===
|
|
162
|
+
if (sample !== 0 && sample !== BYTE_MASK) return;
|
|
163
|
+
if (sample === BYTE_MASK) {
|
|
158
164
|
const x = index % raw.width;
|
|
159
|
-
const byteIndex = Math.floor(index / raw.width) * rowBytes + (x >>
|
|
160
|
-
view.setUint8(byteIndex, view.getUint8(byteIndex) |
|
|
165
|
+
const byteIndex = Math.floor(index / raw.width) * rowBytes + (x >> BYTE_SHIFT);
|
|
166
|
+
view.setUint8(byteIndex, view.getUint8(byteIndex) | PACKED_BIT_MSB_MASK >> (x & BIT_INDEX_MASK));
|
|
161
167
|
}
|
|
162
168
|
}
|
|
163
169
|
return packed;
|
|
@@ -323,8 +329,10 @@ function buildNotesAnnotDict(notes) {
|
|
|
323
329
|
F: require_objects.pdfNum(NOTES_ANNOTATION_HIDDEN_FLAG)
|
|
324
330
|
});
|
|
325
331
|
}
|
|
332
|
+
const XREF_OFFSET_DIGITS = 10;
|
|
333
|
+
const XREF_GENERATION_DIGITS = 5;
|
|
326
334
|
function xrefEntry(offset, generation, inUse) {
|
|
327
|
-
return `${offset.toString().padStart(
|
|
335
|
+
return `${offset.toString().padStart(XREF_OFFSET_DIGITS, "0")} ${generation.toString().padStart(XREF_GENERATION_DIGITS, "0")} ${inUse ? "n" : "f"} \n`;
|
|
328
336
|
}
|
|
329
337
|
function parseResidueRow(residue) {
|
|
330
338
|
const reader = new require_bytes_reader.ByteReader(new TextEncoder().encode(residue.xml));
|
package/dist/write.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as widthOfCode, t as STANDARD_METRICS } from "./afm-widths-
|
|
1
|
+
import { n as widthOfCode, t as STANDARD_METRICS } from "./afm-widths-B_IGbGky.js";
|
|
2
2
|
import { NOTES_ANNOTATION_AUTHOR } from "./notes-annotation-author.js";
|
|
3
3
|
import { pdfArray, pdfBool, pdfDict, pdfHexString, pdfLiteralString, pdfName, pdfNull, pdfNum, pdfRef, pdfStream } from "./objects.js";
|
|
4
4
|
import { ByteWriter, concatBytes } from "./bytes/writer.js";
|
|
@@ -35,6 +35,11 @@ const FLAG_NONSYMBOLIC = 32;
|
|
|
35
35
|
const FLAG_ITALIC = 64;
|
|
36
36
|
const FLAG_FORCE_BOLD = 262144;
|
|
37
37
|
const FILE_ID_BYTES = 16;
|
|
38
|
+
const BITS_PER_BYTE = 8;
|
|
39
|
+
const BYTE_SHIFT = Math.log2(BITS_PER_BYTE);
|
|
40
|
+
const BYTE_MASK = 255;
|
|
41
|
+
const PACKED_BIT_MSB_MASK = 128;
|
|
42
|
+
const BIT_INDEX_MASK = 7;
|
|
38
43
|
function textToPdfString(text) {
|
|
39
44
|
const bytes = new Uint8Array(2 + text.length * 2);
|
|
40
45
|
bytes[0] = 254;
|
|
@@ -42,8 +47,8 @@ function textToPdfString(text) {
|
|
|
42
47
|
let offset = 2;
|
|
43
48
|
for (const unit of text.split("")) {
|
|
44
49
|
const code = unit.charCodeAt(0);
|
|
45
|
-
bytes[offset] = code >>
|
|
46
|
-
bytes[offset + 1] = code &
|
|
50
|
+
bytes[offset] = code >> BITS_PER_BYTE & BYTE_MASK;
|
|
51
|
+
bytes[offset + 1] = code & BYTE_MASK;
|
|
47
52
|
offset += 2;
|
|
48
53
|
}
|
|
49
54
|
return pdfHexString(bytes);
|
|
@@ -107,9 +112,10 @@ function buildFontObjects(standardName, descriptorRef) {
|
|
|
107
112
|
function codePointsOf(texts) {
|
|
108
113
|
return new Set(texts.flatMap((text) => [...text].map((character) => character.codePointAt(0))));
|
|
109
114
|
}
|
|
115
|
+
const JPEG_COMPONENTS_CMYK = 4;
|
|
110
116
|
function prepareJpegImage(bytes) {
|
|
111
117
|
const info = readJpegInfo$1(bytes);
|
|
112
|
-
const colorSpace = info.components === 1 ? "DeviceGray" : info.components ===
|
|
118
|
+
const colorSpace = info.components === 1 ? "DeviceGray" : info.components === JPEG_COMPONENTS_CMYK ? "DeviceCMYK" : "DeviceRGB";
|
|
113
119
|
const entries = /* @__PURE__ */ new Map([
|
|
114
120
|
["Type", pdfName("XObject")],
|
|
115
121
|
["Subtype", pdfName("Image")],
|
|
@@ -119,7 +125,7 @@ function prepareJpegImage(bytes) {
|
|
|
119
125
|
["BitsPerComponent", pdfNum(info.precision)],
|
|
120
126
|
["Filter", pdfName("DCTDecode")]
|
|
121
127
|
]);
|
|
122
|
-
if (info.components ===
|
|
128
|
+
if (info.components === JPEG_COMPONENTS_CMYK && (info.adobeTransform === 2 || info.adobeTransform === void 0)) entries.set("Decode", pdfArray([
|
|
123
129
|
1,
|
|
124
130
|
0,
|
|
125
131
|
1,
|
|
@@ -141,22 +147,22 @@ function pngImageDict(width, height, colorSpace, compress) {
|
|
|
141
147
|
["Width", pdfNum(width)],
|
|
142
148
|
["Height", pdfNum(height)],
|
|
143
149
|
["ColorSpace", pdfName(colorSpace)],
|
|
144
|
-
["BitsPerComponent", pdfNum(
|
|
150
|
+
["BitsPerComponent", pdfNum(BITS_PER_BYTE)]
|
|
145
151
|
]);
|
|
146
152
|
if (compress) entries.set("Filter", pdfName("FlateDecode"));
|
|
147
153
|
return pdfDict(entries);
|
|
148
154
|
}
|
|
149
155
|
function packBilevel(raw) {
|
|
150
|
-
const rowBytes = raw.width +
|
|
156
|
+
const rowBytes = raw.width + BIT_INDEX_MASK >> BYTE_SHIFT;
|
|
151
157
|
const packed = new Uint8Array(rowBytes * raw.height);
|
|
152
158
|
const view = new DataView(packed.buffer);
|
|
153
159
|
for (let index = 0; index < raw.data.length; index++) {
|
|
154
160
|
const sample = raw.data[index];
|
|
155
|
-
if (sample !== 0 && sample !==
|
|
156
|
-
if (sample ===
|
|
161
|
+
if (sample !== 0 && sample !== BYTE_MASK) return;
|
|
162
|
+
if (sample === BYTE_MASK) {
|
|
157
163
|
const x = index % raw.width;
|
|
158
|
-
const byteIndex = Math.floor(index / raw.width) * rowBytes + (x >>
|
|
159
|
-
view.setUint8(byteIndex, view.getUint8(byteIndex) |
|
|
164
|
+
const byteIndex = Math.floor(index / raw.width) * rowBytes + (x >> BYTE_SHIFT);
|
|
165
|
+
view.setUint8(byteIndex, view.getUint8(byteIndex) | PACKED_BIT_MSB_MASK >> (x & BIT_INDEX_MASK));
|
|
160
166
|
}
|
|
161
167
|
}
|
|
162
168
|
return packed;
|
|
@@ -322,8 +328,10 @@ function buildNotesAnnotDict(notes) {
|
|
|
322
328
|
F: pdfNum(NOTES_ANNOTATION_HIDDEN_FLAG)
|
|
323
329
|
});
|
|
324
330
|
}
|
|
331
|
+
const XREF_OFFSET_DIGITS = 10;
|
|
332
|
+
const XREF_GENERATION_DIGITS = 5;
|
|
325
333
|
function xrefEntry(offset, generation, inUse) {
|
|
326
|
-
return `${offset.toString().padStart(
|
|
334
|
+
return `${offset.toString().padStart(XREF_OFFSET_DIGITS, "0")} ${generation.toString().padStart(XREF_GENERATION_DIGITS, "0")} ${inUse ? "n" : "f"} \n`;
|
|
327
335
|
}
|
|
328
336
|
function parseResidueRow(residue) {
|
|
329
337
|
const reader = new ByteReader(new TextEncoder().encode(residue.xml));
|
package/dist/xref.cjs
CHANGED
|
@@ -220,9 +220,10 @@ function readXrefStreamSection(dict, raw, sink) {
|
|
|
220
220
|
prevOffset: require_objects.asNumber(require_objects.dictGet(dict, "Prev"))
|
|
221
221
|
};
|
|
222
222
|
}
|
|
223
|
+
const BYTE_RADIX = 256;
|
|
223
224
|
function readBigEndian(bytes, offset, width) {
|
|
224
225
|
let value = 0;
|
|
225
|
-
for (let i = 0; i < width; i++) value = value *
|
|
226
|
+
for (let i = 0; i < width; i++) value = value * BYTE_RADIX + (bytes[offset + i] ?? 0);
|
|
226
227
|
return value;
|
|
227
228
|
}
|
|
228
229
|
function isBoundaryByte(byte) {
|
|
@@ -238,8 +239,10 @@ function findAllKeywordPositions(bytes, needle) {
|
|
|
238
239
|
}
|
|
239
240
|
return positions;
|
|
240
241
|
}
|
|
242
|
+
const ASCII_DIGIT_ZERO = 48;
|
|
243
|
+
const ASCII_DIGIT_NINE = 57;
|
|
241
244
|
function isDigitByte(byte) {
|
|
242
|
-
return byte !== void 0 && byte >=
|
|
245
|
+
return byte !== void 0 && byte >= ASCII_DIGIT_ZERO && byte <= ASCII_DIGIT_NINE;
|
|
243
246
|
}
|
|
244
247
|
function scanBackWhile(bytes, end, predicate) {
|
|
245
248
|
let i = end;
|
package/dist/xref.js
CHANGED
|
@@ -219,9 +219,10 @@ function readXrefStreamSection(dict, raw, sink) {
|
|
|
219
219
|
prevOffset: asNumber(dictGet(dict, "Prev"))
|
|
220
220
|
};
|
|
221
221
|
}
|
|
222
|
+
const BYTE_RADIX = 256;
|
|
222
223
|
function readBigEndian(bytes, offset, width) {
|
|
223
224
|
let value = 0;
|
|
224
|
-
for (let i = 0; i < width; i++) value = value *
|
|
225
|
+
for (let i = 0; i < width; i++) value = value * BYTE_RADIX + (bytes[offset + i] ?? 0);
|
|
225
226
|
return value;
|
|
226
227
|
}
|
|
227
228
|
function isBoundaryByte(byte) {
|
|
@@ -237,8 +238,10 @@ function findAllKeywordPositions(bytes, needle) {
|
|
|
237
238
|
}
|
|
238
239
|
return positions;
|
|
239
240
|
}
|
|
241
|
+
const ASCII_DIGIT_ZERO = 48;
|
|
242
|
+
const ASCII_DIGIT_NINE = 57;
|
|
240
243
|
function isDigitByte(byte) {
|
|
241
|
-
return byte !== void 0 && byte >=
|
|
244
|
+
return byte !== void 0 && byte >= ASCII_DIGIT_ZERO && byte <= ASCII_DIGIT_NINE;
|
|
242
245
|
}
|
|
243
246
|
function scanBackWhile(bytes, end, predicate) {
|
|
244
247
|
let i = end;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pdf-parser.js",
|
|
3
|
-
"version": "5.2.
|
|
3
|
+
"version": "5.2.28",
|
|
4
4
|
"description": "Hand-written, dependency-minimal PDF codec: parses arbitrary real-world PDFs and generates new ones, built on its own codec-owned LayoutDocument item model and Zod 4 codecs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|