pdf-parser.js 5.2.26 → 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.d.cts +2 -2
- package/dist/annotations.d.ts +2 -2
- package/dist/annotations.js +5 -3
- package/dist/attachments.d.cts +2 -2
- package/dist/attachments.d.ts +2 -2
- 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 +73 -45
- package/dist/cff-bounds.js +73 -45
- 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-read.d.cts +1 -1
- package/dist/content-read.d.ts +1 -1
- package/dist/content-write.cjs +21 -14
- package/dist/content-write.d.cts +2 -2
- package/dist/content-write.d.ts +2 -2
- package/dist/content-write.js +21 -14
- 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/document.cjs +17 -11
- package/dist/document.d.cts +1 -1
- package/dist/document.d.ts +1 -1
- package/dist/document.js +17 -11
- package/dist/{embedded-font-Bnhh4juV.d.ts → embedded-font-ByD7ZiQS.d.ts} +1 -1
- package/dist/{embedded-font-CEf-zBCA.d.cts → embedded-font-DgVBedw6.d.cts} +1 -1
- package/dist/embedded-font-write.d.cts +2 -2
- package/dist/embedded-font-write.d.ts +2 -2
- package/dist/embedded-font.cjs +4 -2
- package/dist/embedded-font.d.cts +1 -1
- package/dist/embedded-font.d.ts +1 -1
- 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.d.cts +1 -1
- package/dist/encrypt-write.d.ts +1 -1
- package/dist/encrypt-write.js +25 -21
- package/dist/encrypt.cjs +43 -64
- package/dist/encrypt.d.cts +1 -1
- package/dist/encrypt.d.ts +1 -1
- package/dist/encrypt.js +43 -64
- package/dist/filters.cjs +46 -26
- package/dist/filters.d.cts +1 -1
- package/dist/filters.d.ts +1 -1
- package/dist/filters.js +46 -26
- 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.d.cts +1 -1
- package/dist/font-read.d.ts +1 -1
- package/dist/font-read.js +12 -6
- package/dist/font-registry.d.cts +3 -3
- package/dist/font-registry.d.ts +3 -3
- package/dist/font-tables.cjs +55 -28
- package/dist/font-tables.js +55 -28
- package/dist/form.cjs +13 -8
- package/dist/form.d.cts +2 -2
- package/dist/form.d.ts +2 -2
- package/dist/form.js +13 -8
- package/dist/gdef-table.cjs +6 -3
- package/dist/gdef-table.js +6 -3
- package/dist/{glyf-contours-C0epBNqP.d.ts → glyf-contours-B1PsI9oA.d.ts} +1 -1
- package/dist/{glyf-contours-BRpvd0rt.d.cts → glyf-contours-NHBpgks-.d.cts} +1 -1
- package/dist/glyf-contours.cjs +3 -1
- package/dist/glyf-contours.d.cts +1 -1
- package/dist/glyf-contours.d.ts +1 -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 +40 -25
- package/dist/gsub-table.js +40 -25
- 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 +61 -32
- package/dist/image/jpeg2000-codestream.js +61 -32
- 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.d.cts +2 -2
- package/dist/images-read.d.ts +2 -2
- package/dist/images-read.js +41 -36
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/interpret.cjs +68 -40
- package/dist/interpret.d.cts +1 -1
- package/dist/interpret.d.ts +1 -1
- package/dist/interpret.js +68 -40
- 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.d.cts +1 -1
- package/dist/math-font-write.d.ts +1 -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/names.cjs +7 -7
- package/dist/names.d.cts +2 -2
- package/dist/names.d.ts +2 -2
- package/dist/names.js +7 -7
- package/dist/navigation.cjs +16 -12
- package/dist/navigation.d.cts +4 -4
- package/dist/navigation.d.ts +4 -4
- package/dist/navigation.js +16 -12
- package/dist/{objects-B7HdMeWS.d.cts → objects-e2RS3-yT.d.cts} +3 -3
- package/dist/{objects-B7HdMeWS.d.ts → objects-e2RS3-yT.d.ts} +3 -3
- package/dist/objects.d.cts +1 -1
- package/dist/objects.d.ts +1 -1
- package/dist/optional-content.d.cts +2 -2
- package/dist/optional-content.d.ts +2 -2
- package/dist/ot-layout-common.cjs +22 -15
- package/dist/ot-layout-common.js +22 -15
- package/dist/parse.cjs +7 -5
- package/dist/parse.d.cts +1 -1
- package/dist/parse.d.ts +1 -1
- 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.d.cts +1 -1
- package/dist/predictors.d.ts +1 -1
- package/dist/predictors.js +14 -9
- package/dist/raster.cjs +30 -19
- package/dist/raster.d.cts +8 -8
- package/dist/raster.d.ts +8 -8
- package/dist/raster.js +30 -19
- package/dist/read.cjs +29 -16
- package/dist/read.js +29 -16
- package/dist/serialize.cjs +6 -2
- package/dist/serialize.d.cts +1 -1
- package/dist/serialize.d.ts +1 -1
- package/dist/serialize.js +6 -2
- package/dist/sfnt-subset.cjs +25 -13
- package/dist/sfnt-subset.d.cts +1 -1
- package/dist/sfnt-subset.d.ts +1 -1
- package/dist/sfnt-subset.js +25 -13
- package/dist/sfnt.cjs +20 -10
- package/dist/sfnt.js +20 -10
- package/dist/structure.d.cts +2 -2
- package/dist/structure.d.ts +2 -2
- package/dist/text-group.cjs +0 -1
- package/dist/text-group.js +0 -1
- package/dist/text-layout.d.cts +1 -1
- package/dist/text-layout.d.ts +1 -1
- package/dist/tounicode.cjs +4 -2
- package/dist/tounicode.d.cts +1 -1
- package/dist/tounicode.d.ts +1 -1
- 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.d.cts +1 -1
- package/dist/write.d.ts +1 -1
- package/dist/write.js +20 -12
- package/dist/xref.cjs +5 -2
- package/dist/xref.d.cts +1 -1
- package/dist/xref.d.ts +1 -1
- package/dist/xref.js +5 -2
- package/package.json +1 -1
package/dist/read.cjs
CHANGED
|
@@ -58,7 +58,9 @@ function readPdf(bytes, options) {
|
|
|
58
58
|
const pageBoxRows = [];
|
|
59
59
|
const pages = pageDicts.map((pageDict, index) => {
|
|
60
60
|
require_util_abort.throwIfAborted(signal);
|
|
61
|
-
|
|
61
|
+
const read = readPage(index, pageDict, doc, fontResolver, images, imageIdCache, destinationRegistry, optionalContent.layerNameOf, structure.ownerOf, sink);
|
|
62
|
+
if (read.boxRow !== void 0) pageBoxRows.push(read.boxRow);
|
|
63
|
+
return read.page;
|
|
62
64
|
});
|
|
63
65
|
if (pageBoxRows.length > 0) source["page-boxes"] = {
|
|
64
66
|
format: "pdf",
|
|
@@ -119,13 +121,20 @@ function rotatedRectBounds(rect, matrix) {
|
|
|
119
121
|
maxY: Math.max(...ys)
|
|
120
122
|
};
|
|
121
123
|
}
|
|
124
|
+
const QUARTER_TURN_DEG = 90;
|
|
125
|
+
const HALF_TURN_DEG = 180;
|
|
126
|
+
const THREE_QUARTER_TURN_DEG = 270;
|
|
127
|
+
const DEGREES_PER_TURN = 360;
|
|
128
|
+
function isNonZeroPageRotation(n) {
|
|
129
|
+
return n === QUARTER_TURN_DEG || n === HALF_TURN_DEG || n === THREE_QUARTER_TURN_DEG;
|
|
130
|
+
}
|
|
122
131
|
function normalizeRotation(rotate) {
|
|
123
132
|
if (rotate === void 0) return 0;
|
|
124
|
-
const normalized = (Math.round(rotate /
|
|
125
|
-
return normalized
|
|
133
|
+
const normalized = (Math.round(rotate / QUARTER_TURN_DEG) * QUARTER_TURN_DEG % DEGREES_PER_TURN + DEGREES_PER_TURN) % DEGREES_PER_TURN;
|
|
134
|
+
return isNonZeroPageRotation(normalized) ? normalized : 0;
|
|
126
135
|
}
|
|
127
136
|
function pageRotationTransform(rotation, w, h) {
|
|
128
|
-
if (rotation ===
|
|
137
|
+
if (rotation === QUARTER_TURN_DEG) return {
|
|
129
138
|
matrix: [
|
|
130
139
|
0,
|
|
131
140
|
-1,
|
|
@@ -137,7 +146,7 @@ function pageRotationTransform(rotation, w, h) {
|
|
|
137
146
|
widthPt: h,
|
|
138
147
|
heightPt: w
|
|
139
148
|
};
|
|
140
|
-
if (rotation ===
|
|
149
|
+
if (rotation === HALF_TURN_DEG) return {
|
|
141
150
|
matrix: [
|
|
142
151
|
-1,
|
|
143
152
|
0,
|
|
@@ -149,7 +158,7 @@ function pageRotationTransform(rotation, w, h) {
|
|
|
149
158
|
widthPt: w,
|
|
150
159
|
heightPt: h
|
|
151
160
|
};
|
|
152
|
-
if (rotation ===
|
|
161
|
+
if (rotation === THREE_QUARTER_TURN_DEG) return {
|
|
153
162
|
matrix: [
|
|
154
163
|
0,
|
|
155
164
|
1,
|
|
@@ -174,6 +183,7 @@ function pageRotationTransform(rotation, w, h) {
|
|
|
174
183
|
heightPt: h
|
|
175
184
|
};
|
|
176
185
|
}
|
|
186
|
+
const CONTENT_STREAM_JOIN_BYTE = 10;
|
|
177
187
|
function readPageContentBytes(page, resolver, sink) {
|
|
178
188
|
const contentsObj = resolver.resolve(require_objects.dictGet(page, "Contents"));
|
|
179
189
|
if (contentsObj?.kind === "stream") return require_filters.decodeStream(contentsObj.raw, contentsObj.dict, sink).bytes;
|
|
@@ -181,7 +191,7 @@ function readPageContentBytes(page, resolver, sink) {
|
|
|
181
191
|
const chunks = [];
|
|
182
192
|
for (const item of contentsObj.items) {
|
|
183
193
|
const streamObj = resolver.resolve(item);
|
|
184
|
-
if (streamObj?.kind === "stream") chunks.push(require_filters.decodeStream(streamObj.raw, streamObj.dict, sink).bytes, new Uint8Array([
|
|
194
|
+
if (streamObj?.kind === "stream") chunks.push(require_filters.decodeStream(streamObj.raw, streamObj.dict, sink).bytes, new Uint8Array([CONTENT_STREAM_JOIN_BYTE]));
|
|
185
195
|
}
|
|
186
196
|
return require_bytes_writer.concatBytes(chunks);
|
|
187
197
|
}
|
|
@@ -196,7 +206,7 @@ function contentItemBounds(item) {
|
|
|
196
206
|
maxY: yPt + heightPt
|
|
197
207
|
});
|
|
198
208
|
if (item.kind === "text" || item.kind === "image" || item.kind === "rect" || item.kind === "ellipse") {
|
|
199
|
-
if (item.kind !== "text" || item.rotationDeg === void 0 || item.rotationDeg %
|
|
209
|
+
if (item.kind !== "text" || item.rotationDeg === void 0 || item.rotationDeg % HALF_TURN_DEG === 0) return frameBounds(item.xPt, item.yPt, item.widthPt ?? 0, item.kind === "text" ? item.sizePt : item.heightPt);
|
|
200
210
|
const rotationDeg = item.rotationDeg;
|
|
201
211
|
const anchorX = item.xPt;
|
|
202
212
|
const anchorY = item.yPt;
|
|
@@ -275,7 +285,7 @@ function pageBoxResidueEntry(pageIndex, page, mediaBox, cropBox) {
|
|
|
275
285
|
for (const [key, value] of declaredBoxes) if (value !== void 0) entries[key] = value;
|
|
276
286
|
return require_objects.pdfDict(entries);
|
|
277
287
|
}
|
|
278
|
-
function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache, destinationRegistry, layerNameOf, structureOwnerOf,
|
|
288
|
+
function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache, destinationRegistry, layerNameOf, structureOwnerOf, sink) {
|
|
279
289
|
const resources = resolver.resolveDict(require_objects.dictGet(page, "Resources"));
|
|
280
290
|
const mediaBox = readMediaBox(page);
|
|
281
291
|
let cropBox = readDeclaredPageBox(page, "CropBox") ?? mediaBox;
|
|
@@ -294,7 +304,6 @@ function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache,
|
|
|
294
304
|
const heightPt = visibleRect.maxY - visibleRect.minY;
|
|
295
305
|
const pageMatrix = require_matrix.multiplyMatrices(rotationResult.matrix, require_matrix.translationMatrix(-visibleRect.minX, -visibleRect.minY));
|
|
296
306
|
const boxRow = pageBoxResidueEntry(pageIndex, page, mediaBox, cropBox);
|
|
297
|
-
if (boxRow !== void 0) pageBoxRows.push(boxRow);
|
|
298
307
|
const items = [];
|
|
299
308
|
if (resources !== void 0) {
|
|
300
309
|
const contentBytes = readPageContentBytes(page, resolver, sink);
|
|
@@ -319,11 +328,14 @@ function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache,
|
|
|
319
328
|
const notes = readPageNotes(page, resolver);
|
|
320
329
|
const annotations = require_annotations.readPageAnnotations(page, pageMatrix, resolver, sink);
|
|
321
330
|
return {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
331
|
+
page: {
|
|
332
|
+
widthPt,
|
|
333
|
+
heightPt,
|
|
334
|
+
items,
|
|
335
|
+
...notes !== void 0 ? { notes } : {},
|
|
336
|
+
...annotations.length > 0 ? { annotations } : {}
|
|
337
|
+
},
|
|
338
|
+
boxRow
|
|
327
339
|
};
|
|
328
340
|
}
|
|
329
341
|
function withStructure(item, structure) {
|
|
@@ -498,8 +510,9 @@ function imagePlacementFrom(matrix) {
|
|
|
498
510
|
rotationDeg: rotationDeg !== 0 ? rotationDeg : void 0
|
|
499
511
|
};
|
|
500
512
|
}
|
|
513
|
+
const HEX_RADIX = 16;
|
|
501
514
|
function registerExtractedImage(format, bytes, widthPx, heightPx, images, original) {
|
|
502
|
-
const imageId = `img${require_bytes_crc32.crc32(bytes).toString(
|
|
515
|
+
const imageId = `img${require_bytes_crc32.crc32(bytes).toString(HEX_RADIX)}`;
|
|
503
516
|
if (!(imageId in images)) images[imageId] = {
|
|
504
517
|
format,
|
|
505
518
|
base64: (0, byte_codec.bytesToBase64)(bytes),
|
package/dist/read.js
CHANGED
|
@@ -57,7 +57,9 @@ function readPdf(bytes, options) {
|
|
|
57
57
|
const pageBoxRows = [];
|
|
58
58
|
const pages = pageDicts.map((pageDict, index) => {
|
|
59
59
|
throwIfAborted(signal);
|
|
60
|
-
|
|
60
|
+
const read = readPage(index, pageDict, doc, fontResolver, images, imageIdCache, destinationRegistry, optionalContent.layerNameOf, structure.ownerOf, sink);
|
|
61
|
+
if (read.boxRow !== void 0) pageBoxRows.push(read.boxRow);
|
|
62
|
+
return read.page;
|
|
61
63
|
});
|
|
62
64
|
if (pageBoxRows.length > 0) source["page-boxes"] = {
|
|
63
65
|
format: "pdf",
|
|
@@ -118,13 +120,20 @@ function rotatedRectBounds(rect, matrix) {
|
|
|
118
120
|
maxY: Math.max(...ys)
|
|
119
121
|
};
|
|
120
122
|
}
|
|
123
|
+
const QUARTER_TURN_DEG = 90;
|
|
124
|
+
const HALF_TURN_DEG = 180;
|
|
125
|
+
const THREE_QUARTER_TURN_DEG = 270;
|
|
126
|
+
const DEGREES_PER_TURN = 360;
|
|
127
|
+
function isNonZeroPageRotation(n) {
|
|
128
|
+
return n === QUARTER_TURN_DEG || n === HALF_TURN_DEG || n === THREE_QUARTER_TURN_DEG;
|
|
129
|
+
}
|
|
121
130
|
function normalizeRotation(rotate) {
|
|
122
131
|
if (rotate === void 0) return 0;
|
|
123
|
-
const normalized = (Math.round(rotate /
|
|
124
|
-
return normalized
|
|
132
|
+
const normalized = (Math.round(rotate / QUARTER_TURN_DEG) * QUARTER_TURN_DEG % DEGREES_PER_TURN + DEGREES_PER_TURN) % DEGREES_PER_TURN;
|
|
133
|
+
return isNonZeroPageRotation(normalized) ? normalized : 0;
|
|
125
134
|
}
|
|
126
135
|
function pageRotationTransform(rotation, w, h) {
|
|
127
|
-
if (rotation ===
|
|
136
|
+
if (rotation === QUARTER_TURN_DEG) return {
|
|
128
137
|
matrix: [
|
|
129
138
|
0,
|
|
130
139
|
-1,
|
|
@@ -136,7 +145,7 @@ function pageRotationTransform(rotation, w, h) {
|
|
|
136
145
|
widthPt: h,
|
|
137
146
|
heightPt: w
|
|
138
147
|
};
|
|
139
|
-
if (rotation ===
|
|
148
|
+
if (rotation === HALF_TURN_DEG) return {
|
|
140
149
|
matrix: [
|
|
141
150
|
-1,
|
|
142
151
|
0,
|
|
@@ -148,7 +157,7 @@ function pageRotationTransform(rotation, w, h) {
|
|
|
148
157
|
widthPt: w,
|
|
149
158
|
heightPt: h
|
|
150
159
|
};
|
|
151
|
-
if (rotation ===
|
|
160
|
+
if (rotation === THREE_QUARTER_TURN_DEG) return {
|
|
152
161
|
matrix: [
|
|
153
162
|
0,
|
|
154
163
|
1,
|
|
@@ -173,6 +182,7 @@ function pageRotationTransform(rotation, w, h) {
|
|
|
173
182
|
heightPt: h
|
|
174
183
|
};
|
|
175
184
|
}
|
|
185
|
+
const CONTENT_STREAM_JOIN_BYTE = 10;
|
|
176
186
|
function readPageContentBytes(page, resolver, sink) {
|
|
177
187
|
const contentsObj = resolver.resolve(dictGet(page, "Contents"));
|
|
178
188
|
if (contentsObj?.kind === "stream") return decodeStream(contentsObj.raw, contentsObj.dict, sink).bytes;
|
|
@@ -180,7 +190,7 @@ function readPageContentBytes(page, resolver, sink) {
|
|
|
180
190
|
const chunks = [];
|
|
181
191
|
for (const item of contentsObj.items) {
|
|
182
192
|
const streamObj = resolver.resolve(item);
|
|
183
|
-
if (streamObj?.kind === "stream") chunks.push(decodeStream(streamObj.raw, streamObj.dict, sink).bytes, new Uint8Array([
|
|
193
|
+
if (streamObj?.kind === "stream") chunks.push(decodeStream(streamObj.raw, streamObj.dict, sink).bytes, new Uint8Array([CONTENT_STREAM_JOIN_BYTE]));
|
|
184
194
|
}
|
|
185
195
|
return concatBytes(chunks);
|
|
186
196
|
}
|
|
@@ -195,7 +205,7 @@ function contentItemBounds(item) {
|
|
|
195
205
|
maxY: yPt + heightPt
|
|
196
206
|
});
|
|
197
207
|
if (item.kind === "text" || item.kind === "image" || item.kind === "rect" || item.kind === "ellipse") {
|
|
198
|
-
if (item.kind !== "text" || item.rotationDeg === void 0 || item.rotationDeg %
|
|
208
|
+
if (item.kind !== "text" || item.rotationDeg === void 0 || item.rotationDeg % HALF_TURN_DEG === 0) return frameBounds(item.xPt, item.yPt, item.widthPt ?? 0, item.kind === "text" ? item.sizePt : item.heightPt);
|
|
199
209
|
const rotationDeg = item.rotationDeg;
|
|
200
210
|
const anchorX = item.xPt;
|
|
201
211
|
const anchorY = item.yPt;
|
|
@@ -274,7 +284,7 @@ function pageBoxResidueEntry(pageIndex, page, mediaBox, cropBox) {
|
|
|
274
284
|
for (const [key, value] of declaredBoxes) if (value !== void 0) entries[key] = value;
|
|
275
285
|
return pdfDict(entries);
|
|
276
286
|
}
|
|
277
|
-
function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache, destinationRegistry, layerNameOf, structureOwnerOf,
|
|
287
|
+
function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache, destinationRegistry, layerNameOf, structureOwnerOf, sink) {
|
|
278
288
|
const resources = resolver.resolveDict(dictGet(page, "Resources"));
|
|
279
289
|
const mediaBox = readMediaBox(page);
|
|
280
290
|
let cropBox = readDeclaredPageBox(page, "CropBox") ?? mediaBox;
|
|
@@ -293,7 +303,6 @@ function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache,
|
|
|
293
303
|
const heightPt = visibleRect.maxY - visibleRect.minY;
|
|
294
304
|
const pageMatrix = multiplyMatrices(rotationResult.matrix, translationMatrix(-visibleRect.minX, -visibleRect.minY));
|
|
295
305
|
const boxRow = pageBoxResidueEntry(pageIndex, page, mediaBox, cropBox);
|
|
296
|
-
if (boxRow !== void 0) pageBoxRows.push(boxRow);
|
|
297
306
|
const items = [];
|
|
298
307
|
if (resources !== void 0) {
|
|
299
308
|
const contentBytes = readPageContentBytes(page, resolver, sink);
|
|
@@ -318,11 +327,14 @@ function readPage(pageIndex, page, resolver, fontResolver, images, imageIdCache,
|
|
|
318
327
|
const notes = readPageNotes(page, resolver);
|
|
319
328
|
const annotations = readPageAnnotations(page, pageMatrix, resolver, sink);
|
|
320
329
|
return {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
330
|
+
page: {
|
|
331
|
+
widthPt,
|
|
332
|
+
heightPt,
|
|
333
|
+
items,
|
|
334
|
+
...notes !== void 0 ? { notes } : {},
|
|
335
|
+
...annotations.length > 0 ? { annotations } : {}
|
|
336
|
+
},
|
|
337
|
+
boxRow
|
|
326
338
|
};
|
|
327
339
|
}
|
|
328
340
|
function withStructure(item, structure) {
|
|
@@ -497,8 +509,9 @@ function imagePlacementFrom(matrix) {
|
|
|
497
509
|
rotationDeg: rotationDeg !== 0 ? rotationDeg : void 0
|
|
498
510
|
};
|
|
499
511
|
}
|
|
512
|
+
const HEX_RADIX = 16;
|
|
500
513
|
function registerExtractedImage(format, bytes, widthPx, heightPx, images, original) {
|
|
501
|
-
const imageId = `img${crc32(bytes).toString(
|
|
514
|
+
const imageId = `img${crc32(bytes).toString(HEX_RADIX)}`;
|
|
502
515
|
if (!(imageId in images)) images[imageId] = {
|
|
503
516
|
format,
|
|
504
517
|
base64: bytesToBase64(bytes),
|
package/dist/serialize.cjs
CHANGED
|
@@ -8,18 +8,22 @@ function formatNumber(n) {
|
|
|
8
8
|
if (Math.abs(n) < NUMBER_EPSILON) return "0";
|
|
9
9
|
return n.toFixed(NUMBER_DECIMAL_PLACES).replace(/0+$/, "").replace(/\.$/, "");
|
|
10
10
|
}
|
|
11
|
+
const NAME_SAFE_RANGE_START = 33;
|
|
12
|
+
const NAME_SAFE_RANGE_END = 126;
|
|
13
|
+
const HEX_RADIX = 16;
|
|
14
|
+
const HEX_DIGIT_WIDTH = 2;
|
|
11
15
|
function escapeName(name) {
|
|
12
16
|
let out = "";
|
|
13
17
|
for (const ch of name) {
|
|
14
18
|
const code = ch.codePointAt(0);
|
|
15
|
-
if (code <
|
|
19
|
+
if (code < NAME_SAFE_RANGE_START || code > NAME_SAFE_RANGE_END || "#()<>[]{}/%".includes(ch)) out += `#${code.toString(HEX_RADIX).padStart(HEX_DIGIT_WIDTH, "0")}`;
|
|
16
20
|
else out += ch;
|
|
17
21
|
}
|
|
18
22
|
return out;
|
|
19
23
|
}
|
|
20
24
|
function bytesToHex(bytes) {
|
|
21
25
|
let out = "";
|
|
22
|
-
for (const byte of bytes) out += byte.toString(
|
|
26
|
+
for (const byte of bytes) out += byte.toString(HEX_RADIX).padStart(HEX_DIGIT_WIDTH, "0");
|
|
23
27
|
return out;
|
|
24
28
|
}
|
|
25
29
|
function writeDictBody(writer, entries) {
|
package/dist/serialize.d.cts
CHANGED
package/dist/serialize.d.ts
CHANGED
package/dist/serialize.js
CHANGED
|
@@ -7,18 +7,22 @@ function formatNumber(n) {
|
|
|
7
7
|
if (Math.abs(n) < NUMBER_EPSILON) return "0";
|
|
8
8
|
return n.toFixed(NUMBER_DECIMAL_PLACES).replace(/0+$/, "").replace(/\.$/, "");
|
|
9
9
|
}
|
|
10
|
+
const NAME_SAFE_RANGE_START = 33;
|
|
11
|
+
const NAME_SAFE_RANGE_END = 126;
|
|
12
|
+
const HEX_RADIX = 16;
|
|
13
|
+
const HEX_DIGIT_WIDTH = 2;
|
|
10
14
|
function escapeName(name) {
|
|
11
15
|
let out = "";
|
|
12
16
|
for (const ch of name) {
|
|
13
17
|
const code = ch.codePointAt(0);
|
|
14
|
-
if (code <
|
|
18
|
+
if (code < NAME_SAFE_RANGE_START || code > NAME_SAFE_RANGE_END || "#()<>[]{}/%".includes(ch)) out += `#${code.toString(HEX_RADIX).padStart(HEX_DIGIT_WIDTH, "0")}`;
|
|
15
19
|
else out += ch;
|
|
16
20
|
}
|
|
17
21
|
return out;
|
|
18
22
|
}
|
|
19
23
|
function bytesToHex(bytes) {
|
|
20
24
|
let out = "";
|
|
21
|
-
for (const byte of bytes) out += byte.toString(
|
|
25
|
+
for (const byte of bytes) out += byte.toString(HEX_RADIX).padStart(HEX_DIGIT_WIDTH, "0");
|
|
22
26
|
return out;
|
|
23
27
|
}
|
|
24
28
|
function writeDictBody(writer, entries) {
|
package/dist/sfnt-subset.cjs
CHANGED
|
@@ -21,6 +21,13 @@ const LEFT_SIDE_BEARING_SIZE = 2;
|
|
|
21
21
|
const LOCA_LONG_ENTRY_SIZE = 4;
|
|
22
22
|
const TABLE_DIRECTORY_HEADER_SIZE = 12;
|
|
23
23
|
const TABLE_RECORD_SIZE = 16;
|
|
24
|
+
const SFNT_HEADER_NUM_TABLES_OFFSET = 4;
|
|
25
|
+
const SFNT_HEADER_SEARCH_RANGE_OFFSET = 6;
|
|
26
|
+
const SFNT_HEADER_ENTRY_SELECTOR_OFFSET = 8;
|
|
27
|
+
const SFNT_HEADER_RANGE_SHIFT_OFFSET = 10;
|
|
28
|
+
const TABLE_RECORD_CHECKSUM_OFFSET = 4;
|
|
29
|
+
const TABLE_RECORD_TABLE_OFFSET_OFFSET = 8;
|
|
30
|
+
const TABLE_RECORD_LENGTH_OFFSET = 12;
|
|
24
31
|
const SFNT_VERSION_TRUETYPE = 65536;
|
|
25
32
|
const CHECKSUM_ADJUSTMENT_MAGIC = 2981146554;
|
|
26
33
|
const GLYPH_ALIGNMENT = 4;
|
|
@@ -32,15 +39,20 @@ const COPIED_TAGS = [
|
|
|
32
39
|
function alignUp(value) {
|
|
33
40
|
return Math.ceil(value / GLYPH_ALIGNMENT) * GLYPH_ALIGNMENT;
|
|
34
41
|
}
|
|
42
|
+
const BITS_PER_BYTE = 8;
|
|
43
|
+
const BYTE_MASK = 255;
|
|
44
|
+
const U32_BYTE_2_SHIFT = 16;
|
|
45
|
+
const U32_BYTE_1_SHIFT = 24;
|
|
46
|
+
const U32_LAST_BYTE_OFFSET = 3;
|
|
35
47
|
function writeU16(bytes, offset, value) {
|
|
36
|
-
bytes[offset] = value >>>
|
|
37
|
-
bytes[offset + 1] = value &
|
|
48
|
+
bytes[offset] = value >>> BITS_PER_BYTE & BYTE_MASK;
|
|
49
|
+
bytes[offset + 1] = value & BYTE_MASK;
|
|
38
50
|
}
|
|
39
51
|
function writeU32(bytes, offset, value) {
|
|
40
|
-
bytes[offset] = value >>>
|
|
41
|
-
bytes[offset + 1] = value >>>
|
|
42
|
-
bytes[offset + 2] = value >>>
|
|
43
|
-
bytes[offset +
|
|
52
|
+
bytes[offset] = value >>> U32_BYTE_1_SHIFT & BYTE_MASK;
|
|
53
|
+
bytes[offset + 1] = value >>> U32_BYTE_2_SHIFT & BYTE_MASK;
|
|
54
|
+
bytes[offset + 2] = value >>> BITS_PER_BYTE & BYTE_MASK;
|
|
55
|
+
bytes[offset + U32_LAST_BYTE_OFFSET] = value & BYTE_MASK;
|
|
44
56
|
}
|
|
45
57
|
function checksum(bytes, offset, length) {
|
|
46
58
|
let sum = 0;
|
|
@@ -230,19 +242,19 @@ function subsetSfnt(font, codePoints, extraGlyphIds = []) {
|
|
|
230
242
|
}
|
|
231
243
|
const file = new Uint8Array(fileLength);
|
|
232
244
|
writeU32(file, 0, SFNT_VERSION_TRUETYPE);
|
|
233
|
-
writeU16(file,
|
|
234
|
-
writeU16(file,
|
|
235
|
-
writeU16(file,
|
|
236
|
-
writeU16(file,
|
|
245
|
+
writeU16(file, SFNT_HEADER_NUM_TABLES_OFFSET, numTables);
|
|
246
|
+
writeU16(file, SFNT_HEADER_SEARCH_RANGE_OFFSET, searchRange);
|
|
247
|
+
writeU16(file, SFNT_HEADER_ENTRY_SELECTOR_OFFSET, entrySelector);
|
|
248
|
+
writeU16(file, SFNT_HEADER_RANGE_SHIFT_OFFSET, rangeShift);
|
|
237
249
|
for (let i = 0; i < numTables; i++) {
|
|
238
250
|
const table = tables[i];
|
|
239
251
|
const tableOffset = offsets[i];
|
|
240
252
|
file.set(table.data, tableOffset);
|
|
241
253
|
const recordOffset = TABLE_DIRECTORY_HEADER_SIZE + i * TABLE_RECORD_SIZE;
|
|
242
254
|
for (let c = 0; c < table.tag.length; c++) file[recordOffset + c] = table.tag.charCodeAt(c);
|
|
243
|
-
writeU32(file, recordOffset +
|
|
244
|
-
writeU32(file, recordOffset +
|
|
245
|
-
writeU32(file, recordOffset +
|
|
255
|
+
writeU32(file, recordOffset + TABLE_RECORD_CHECKSUM_OFFSET, checksum(file, tableOffset, alignUp(table.data.length)));
|
|
256
|
+
writeU32(file, recordOffset + TABLE_RECORD_TABLE_OFFSET_OFFSET, tableOffset);
|
|
257
|
+
writeU32(file, recordOffset + TABLE_RECORD_LENGTH_OFFSET, table.data.length);
|
|
246
258
|
}
|
|
247
259
|
const headOffsetInFile = offsets[tables.findIndex((table) => table.tag === "head")];
|
|
248
260
|
writeU32(file, headOffsetInFile + HEAD_CHECKSUM_ADJUSTMENT_OFFSET, CHECKSUM_ADJUSTMENT_MAGIC - checksum(file, 0, fileLength) >>> 0);
|
package/dist/sfnt-subset.d.cts
CHANGED
|
@@ -6,6 +6,6 @@ interface SfntSubsetResult {
|
|
|
6
6
|
readonly glyphIds: readonly number[];
|
|
7
7
|
readonly unmappedCodePoints: readonly number[];
|
|
8
8
|
}
|
|
9
|
-
declare function subsetSfnt(font: SfntFont, codePoints: Iterable<number
|
|
9
|
+
declare function subsetSfnt(font: SfntFont, codePoints: Readonly<Iterable<number>>, extraGlyphIds?: Readonly<Iterable<number>>): SfntSubsetResult | undefined;
|
|
10
10
|
//#endregion
|
|
11
11
|
export { SfntSubsetResult, subsetSfnt };
|
package/dist/sfnt-subset.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ interface SfntSubsetResult {
|
|
|
6
6
|
readonly glyphIds: readonly number[];
|
|
7
7
|
readonly unmappedCodePoints: readonly number[];
|
|
8
8
|
}
|
|
9
|
-
declare function subsetSfnt(font: SfntFont, codePoints: Iterable<number
|
|
9
|
+
declare function subsetSfnt(font: SfntFont, codePoints: Readonly<Iterable<number>>, extraGlyphIds?: Readonly<Iterable<number>>): SfntSubsetResult | undefined;
|
|
10
10
|
//#endregion
|
|
11
11
|
export { SfntSubsetResult, subsetSfnt };
|
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/structure.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PdfDiagnosticSink } from "./diagnostics.cjs";
|
|
2
|
-
import { n as PdfDict } from "./objects-
|
|
2
|
+
import { n as PdfDict } from "./objects-e2RS3-yT.cjs";
|
|
3
3
|
import { PdfObjectResolver } from "./interpret.cjs";
|
|
4
4
|
import { LayoutStructureElement } from "./layout.cjs";
|
|
5
5
|
//#region src/structure.d.ts
|
|
@@ -7,6 +7,6 @@ interface StructureContext {
|
|
|
7
7
|
readonly tree: readonly LayoutStructureElement[];
|
|
8
8
|
readonly ownerOf: (pageIndex: number, mcid: number) => string | undefined;
|
|
9
9
|
}
|
|
10
|
-
declare function readStructure(catalog: PdfDict, pages: readonly PdfDict[], resolver: PdfObjectResolver
|
|
10
|
+
declare function readStructure(catalog: PdfDict, pages: readonly PdfDict[], resolver: Readonly<PdfObjectResolver>, sink: PdfDiagnosticSink): StructureContext;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { StructureContext, readStructure };
|
package/dist/structure.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PdfDiagnosticSink } from "./diagnostics.js";
|
|
2
|
-
import { n as PdfDict } from "./objects-
|
|
2
|
+
import { n as PdfDict } from "./objects-e2RS3-yT.js";
|
|
3
3
|
import { PdfObjectResolver } from "./interpret.js";
|
|
4
4
|
import { LayoutStructureElement } from "./layout.js";
|
|
5
5
|
//#region src/structure.d.ts
|
|
@@ -7,6 +7,6 @@ interface StructureContext {
|
|
|
7
7
|
readonly tree: readonly LayoutStructureElement[];
|
|
8
8
|
readonly ownerOf: (pageIndex: number, mcid: number) => string | undefined;
|
|
9
9
|
}
|
|
10
|
-
declare function readStructure(catalog: PdfDict, pages: readonly PdfDict[], resolver: PdfObjectResolver
|
|
10
|
+
declare function readStructure(catalog: PdfDict, pages: readonly PdfDict[], resolver: Readonly<PdfObjectResolver>, sink: PdfDiagnosticSink): StructureContext;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { StructureContext, readStructure };
|