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.
Files changed (221) hide show
  1. package/dist/{afm-widths-BYiX2L9D.cjs → afm-widths-BHD2HZIL.cjs} +553 -642
  2. package/dist/{afm-widths-blUDDjlI.js → afm-widths-B_IGbGky.js} +553 -642
  3. package/dist/afm-widths.cjs +1 -1
  4. package/dist/afm-widths.js +1 -1
  5. package/dist/annotations.cjs +5 -3
  6. package/dist/annotations.d.cts +2 -2
  7. package/dist/annotations.d.ts +2 -2
  8. package/dist/annotations.js +5 -3
  9. package/dist/attachments.d.cts +2 -2
  10. package/dist/attachments.d.ts +2 -2
  11. package/dist/builtin-encoding.cjs +17 -6
  12. package/dist/builtin-encoding.js +17 -6
  13. package/dist/bytes/crc32.cjs +5 -3
  14. package/dist/bytes/crc32.js +5 -3
  15. package/dist/bytes/flate.cjs +0 -1
  16. package/dist/bytes/flate.js +0 -1
  17. package/dist/cff-bounds.cjs +73 -45
  18. package/dist/cff-bounds.js +73 -45
  19. package/dist/cff.cjs +13 -6
  20. package/dist/cff.js +13 -6
  21. package/dist/cmap-table.cjs +54 -26
  22. package/dist/cmap-table.js +54 -26
  23. package/dist/cmap.cjs +5 -3
  24. package/dist/cmap.js +5 -3
  25. package/dist/content-read.d.cts +1 -1
  26. package/dist/content-read.d.ts +1 -1
  27. package/dist/content-write.cjs +21 -14
  28. package/dist/content-write.d.cts +2 -2
  29. package/dist/content-write.d.ts +2 -2
  30. package/dist/content-write.js +21 -14
  31. package/dist/crypto/aes.cjs +76 -55
  32. package/dist/crypto/aes.js +76 -55
  33. package/dist/crypto/md5.cjs +345 -149
  34. package/dist/crypto/md5.js +345 -149
  35. package/dist/crypto/rc4.cjs +5 -4
  36. package/dist/crypto/rc4.js +5 -4
  37. package/dist/crypto/sha2.cjs +92 -43
  38. package/dist/crypto/sha2.js +92 -43
  39. package/dist/document.cjs +17 -11
  40. package/dist/document.d.cts +1 -1
  41. package/dist/document.d.ts +1 -1
  42. package/dist/document.js +17 -11
  43. package/dist/{embedded-font-Bnhh4juV.d.ts → embedded-font-ByD7ZiQS.d.ts} +1 -1
  44. package/dist/{embedded-font-CEf-zBCA.d.cts → embedded-font-DgVBedw6.d.cts} +1 -1
  45. package/dist/embedded-font-write.d.cts +2 -2
  46. package/dist/embedded-font-write.d.ts +2 -2
  47. package/dist/embedded-font.cjs +4 -2
  48. package/dist/embedded-font.d.cts +1 -1
  49. package/dist/embedded-font.d.ts +1 -1
  50. package/dist/embedded-font.js +4 -2
  51. package/dist/encoding.cjs +1 -1
  52. package/dist/encoding.js +1 -1
  53. package/dist/encrypt-write.cjs +25 -21
  54. package/dist/encrypt-write.d.cts +1 -1
  55. package/dist/encrypt-write.d.ts +1 -1
  56. package/dist/encrypt-write.js +25 -21
  57. package/dist/encrypt.cjs +43 -64
  58. package/dist/encrypt.d.cts +1 -1
  59. package/dist/encrypt.d.ts +1 -1
  60. package/dist/encrypt.js +43 -64
  61. package/dist/filters.cjs +46 -26
  62. package/dist/filters.d.cts +1 -1
  63. package/dist/filters.d.ts +1 -1
  64. package/dist/filters.js +46 -26
  65. package/dist/font-face.cjs +2 -1
  66. package/dist/font-face.js +2 -1
  67. package/dist/font-read.cjs +12 -6
  68. package/dist/font-read.d.cts +1 -1
  69. package/dist/font-read.d.ts +1 -1
  70. package/dist/font-read.js +12 -6
  71. package/dist/font-registry.d.cts +3 -3
  72. package/dist/font-registry.d.ts +3 -3
  73. package/dist/font-tables.cjs +55 -28
  74. package/dist/font-tables.js +55 -28
  75. package/dist/form.cjs +13 -8
  76. package/dist/form.d.cts +2 -2
  77. package/dist/form.d.ts +2 -2
  78. package/dist/form.js +13 -8
  79. package/dist/gdef-table.cjs +6 -3
  80. package/dist/gdef-table.js +6 -3
  81. package/dist/{glyf-contours-C0epBNqP.d.ts → glyf-contours-B1PsI9oA.d.ts} +1 -1
  82. package/dist/{glyf-contours-BRpvd0rt.d.cts → glyf-contours-NHBpgks-.d.cts} +1 -1
  83. package/dist/glyf-contours.cjs +3 -1
  84. package/dist/glyf-contours.d.cts +1 -1
  85. package/dist/glyf-contours.d.ts +1 -1
  86. package/dist/glyf-contours.js +3 -1
  87. package/dist/glyf.cjs +22 -11
  88. package/dist/glyf.js +22 -11
  89. package/dist/gpos-table.cjs +37 -19
  90. package/dist/gpos-table.js +37 -19
  91. package/dist/gsub-table.cjs +40 -25
  92. package/dist/gsub-table.js +40 -25
  93. package/dist/hmtx-table.cjs +5 -3
  94. package/dist/hmtx-table.js +5 -3
  95. package/dist/image/ccitt-encode.cjs +8 -5
  96. package/dist/image/ccitt-encode.js +8 -5
  97. package/dist/image/ccitt.cjs +801 -209
  98. package/dist/image/ccitt.js +801 -209
  99. package/dist/image/jbig2-arith.cjs +340 -306
  100. package/dist/image/jbig2-arith.js +340 -306
  101. package/dist/image/jbig2-bitmap.cjs +8 -5
  102. package/dist/image/jbig2-bitmap.js +8 -5
  103. package/dist/image/jbig2-generic.cjs +240 -69
  104. package/dist/image/jbig2-generic.js +240 -69
  105. package/dist/image/jbig2-text.cjs +4 -2
  106. package/dist/image/jbig2-text.js +4 -2
  107. package/dist/image/jbig2.cjs +69 -31
  108. package/dist/image/jbig2.js +69 -31
  109. package/dist/image/jp2-boxes.cjs +52 -27
  110. package/dist/image/jp2-boxes.js +52 -27
  111. package/dist/image/jpeg-info.cjs +29 -24
  112. package/dist/image/jpeg-info.js +29 -24
  113. package/dist/image/jpeg2000-codestream.cjs +61 -32
  114. package/dist/image/jpeg2000-codestream.js +61 -32
  115. package/dist/image/jpeg2000-dwt.cjs +2 -1
  116. package/dist/image/jpeg2000-dwt.js +2 -1
  117. package/dist/image/jpeg2000-t1.cjs +21 -11
  118. package/dist/image/jpeg2000-t1.js +21 -11
  119. package/dist/image/jpeg2000-t2.cjs +12 -5
  120. package/dist/image/jpeg2000-t2.js +12 -5
  121. package/dist/image/jpeg2000-tagtree.cjs +8 -4
  122. package/dist/image/jpeg2000-tagtree.js +8 -4
  123. package/dist/image/jpeg2000.cjs +11 -6
  124. package/dist/image/jpeg2000.js +11 -6
  125. package/dist/image/png-decode.cjs +62 -39
  126. package/dist/image/png-decode.d.cts +3 -2
  127. package/dist/image/png-decode.d.ts +3 -2
  128. package/dist/image/png-decode.js +62 -39
  129. package/dist/image/png-filter.cjs +23 -15
  130. package/dist/image/png-filter.js +23 -15
  131. package/dist/images-read.cjs +41 -36
  132. package/dist/images-read.d.cts +2 -2
  133. package/dist/images-read.d.ts +2 -2
  134. package/dist/images-read.js +41 -36
  135. package/dist/index.cjs +1 -1
  136. package/dist/index.d.cts +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +1 -1
  139. package/dist/interpret.cjs +68 -40
  140. package/dist/interpret.d.cts +1 -1
  141. package/dist/interpret.d.ts +1 -1
  142. package/dist/interpret.js +68 -40
  143. package/dist/lexer.cjs +86 -51
  144. package/dist/lexer.js +86 -51
  145. package/dist/math-content-write.cjs +9 -5
  146. package/dist/math-content-write.js +9 -5
  147. package/dist/math-font-write.cjs +2 -1
  148. package/dist/math-font-write.d.cts +1 -1
  149. package/dist/math-font-write.d.ts +1 -1
  150. package/dist/math-font-write.js +2 -1
  151. package/dist/math-font.cjs +16 -7
  152. package/dist/math-font.js +16 -7
  153. package/dist/math-table.cjs +25 -13
  154. package/dist/math-table.js +25 -13
  155. package/dist/matrix.cjs +3 -2
  156. package/dist/matrix.js +3 -2
  157. package/dist/measure.cjs +1 -1
  158. package/dist/measure.js +1 -1
  159. package/dist/names.cjs +7 -7
  160. package/dist/names.d.cts +2 -2
  161. package/dist/names.d.ts +2 -2
  162. package/dist/names.js +7 -7
  163. package/dist/navigation.cjs +16 -12
  164. package/dist/navigation.d.cts +4 -4
  165. package/dist/navigation.d.ts +4 -4
  166. package/dist/navigation.js +16 -12
  167. package/dist/{objects-B7HdMeWS.d.cts → objects-e2RS3-yT.d.cts} +3 -3
  168. package/dist/{objects-B7HdMeWS.d.ts → objects-e2RS3-yT.d.ts} +3 -3
  169. package/dist/objects.d.cts +1 -1
  170. package/dist/objects.d.ts +1 -1
  171. package/dist/optional-content.d.cts +2 -2
  172. package/dist/optional-content.d.ts +2 -2
  173. package/dist/ot-layout-common.cjs +22 -15
  174. package/dist/ot-layout-common.js +22 -15
  175. package/dist/parse.cjs +7 -5
  176. package/dist/parse.d.cts +1 -1
  177. package/dist/parse.d.ts +1 -1
  178. package/dist/parse.js +7 -5
  179. package/dist/pdf-text.cjs +5 -2
  180. package/dist/pdf-text.js +5 -2
  181. package/dist/predictors.cjs +14 -9
  182. package/dist/predictors.d.cts +1 -1
  183. package/dist/predictors.d.ts +1 -1
  184. package/dist/predictors.js +14 -9
  185. package/dist/raster.cjs +30 -19
  186. package/dist/raster.d.cts +8 -8
  187. package/dist/raster.d.ts +8 -8
  188. package/dist/raster.js +30 -19
  189. package/dist/read.cjs +29 -16
  190. package/dist/read.js +29 -16
  191. package/dist/serialize.cjs +6 -2
  192. package/dist/serialize.d.cts +1 -1
  193. package/dist/serialize.d.ts +1 -1
  194. package/dist/serialize.js +6 -2
  195. package/dist/sfnt-subset.cjs +25 -13
  196. package/dist/sfnt-subset.d.cts +1 -1
  197. package/dist/sfnt-subset.d.ts +1 -1
  198. package/dist/sfnt-subset.js +25 -13
  199. package/dist/sfnt.cjs +20 -10
  200. package/dist/sfnt.js +20 -10
  201. package/dist/structure.d.cts +2 -2
  202. package/dist/structure.d.ts +2 -2
  203. package/dist/text-group.cjs +0 -1
  204. package/dist/text-group.js +0 -1
  205. package/dist/text-layout.d.cts +1 -1
  206. package/dist/text-layout.d.ts +1 -1
  207. package/dist/tounicode.cjs +4 -2
  208. package/dist/tounicode.d.cts +1 -1
  209. package/dist/tounicode.d.ts +1 -1
  210. package/dist/tounicode.js +4 -2
  211. package/dist/winansi.cjs +1 -1
  212. package/dist/winansi.js +1 -1
  213. package/dist/write.cjs +20 -12
  214. package/dist/write.d.cts +1 -1
  215. package/dist/write.d.ts +1 -1
  216. package/dist/write.js +20 -12
  217. package/dist/xref.cjs +5 -2
  218. package/dist/xref.d.cts +1 -1
  219. package/dist/xref.d.ts +1 -1
  220. package/dist/xref.js +5 -2
  221. 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
- return readPage(index, pageDict, doc, fontResolver, images, imageIdCache, destinationRegistry, optionalContent.layerNameOf, structure.ownerOf, pageBoxRows, sink);
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 / 90) * 90 % 360 + 360) % 360;
125
- return normalized === 90 || normalized === 180 || normalized === 270 ? normalized : 0;
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 === 90) return {
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 === 180) return {
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 === 270) return {
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([10]));
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 % 180 === 0) return frameBounds(item.xPt, item.yPt, item.widthPt ?? 0, item.kind === "text" ? item.sizePt : item.heightPt);
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, pageBoxRows, sink) {
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
- widthPt,
323
- heightPt,
324
- items,
325
- ...notes !== void 0 ? { notes } : {},
326
- ...annotations.length > 0 ? { annotations } : {}
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(16)}`;
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
- return readPage(index, pageDict, doc, fontResolver, images, imageIdCache, destinationRegistry, optionalContent.layerNameOf, structure.ownerOf, pageBoxRows, sink);
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 / 90) * 90 % 360 + 360) % 360;
124
- return normalized === 90 || normalized === 180 || normalized === 270 ? normalized : 0;
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 === 90) return {
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 === 180) return {
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 === 270) return {
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([10]));
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 % 180 === 0) return frameBounds(item.xPt, item.yPt, item.widthPt ?? 0, item.kind === "text" ? item.sizePt : item.heightPt);
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, pageBoxRows, sink) {
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
- widthPt,
322
- heightPt,
323
- items,
324
- ...notes !== void 0 ? { notes } : {},
325
- ...annotations.length > 0 ? { annotations } : {}
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(16)}`;
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),
@@ -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 < 33 || code > 126 || "#()<>[]{}/%".includes(ch)) out += `#${code.toString(16).padStart(2, "0")}`;
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(16).padStart(2, "0");
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) {
@@ -1,4 +1,4 @@
1
- import { r as PdfObject } from "./objects-B7HdMeWS.cjs";
1
+ import { r as PdfObject } from "./objects-e2RS3-yT.cjs";
2
2
  import { ByteWriter } from "./bytes/writer.cjs";
3
3
  //#region src/serialize.d.ts
4
4
  declare function formatNumber(n: number): string;
@@ -1,4 +1,4 @@
1
- import { r as PdfObject } from "./objects-B7HdMeWS.js";
1
+ import { r as PdfObject } from "./objects-e2RS3-yT.js";
2
2
  import { ByteWriter } from "./bytes/writer.js";
3
3
  //#region src/serialize.d.ts
4
4
  declare function formatNumber(n: number): string;
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 < 33 || code > 126 || "#()<>[]{}/%".includes(ch)) out += `#${code.toString(16).padStart(2, "0")}`;
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(16).padStart(2, "0");
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) {
@@ -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 >>> 8 & 255;
37
- bytes[offset + 1] = value & 255;
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 >>> 24 & 255;
41
- bytes[offset + 1] = value >>> 16 & 255;
42
- bytes[offset + 2] = value >>> 8 & 255;
43
- bytes[offset + 3] = value & 255;
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, 4, numTables);
234
- writeU16(file, 6, searchRange);
235
- writeU16(file, 8, entrySelector);
236
- writeU16(file, 10, rangeShift);
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 + 4, checksum(file, tableOffset, alignUp(table.data.length)));
244
- writeU32(file, recordOffset + 8, tableOffset);
245
- writeU32(file, recordOffset + 12, table.data.length);
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);
@@ -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>, extraGlyphIds?: Iterable<number>): SfntSubsetResult | undefined;
9
+ declare function subsetSfnt(font: SfntFont, codePoints: Readonly<Iterable<number>>, extraGlyphIds?: Readonly<Iterable<number>>): SfntSubsetResult | undefined;
10
10
  //#endregion
11
11
  export { SfntSubsetResult, subsetSfnt };
@@ -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>, extraGlyphIds?: Iterable<number>): SfntSubsetResult | undefined;
9
+ declare function subsetSfnt(font: SfntFont, codePoints: Readonly<Iterable<number>>, extraGlyphIds?: Readonly<Iterable<number>>): SfntSubsetResult | undefined;
10
10
  //#endregion
11
11
  export { SfntSubsetResult, subsetSfnt };
@@ -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 >>> 8 & 255;
36
- bytes[offset + 1] = value & 255;
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 >>> 24 & 255;
40
- bytes[offset + 1] = value >>> 16 & 255;
41
- bytes[offset + 2] = value >>> 8 & 255;
42
- bytes[offset + 3] = value & 255;
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, 4, numTables);
233
- writeU16(file, 6, searchRange);
234
- writeU16(file, 8, entrySelector);
235
- writeU16(file, 10, rangeShift);
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 + 4, checksum(file, tableOffset, alignUp(table.data.length)));
243
- writeU32(file, recordOffset + 8, tableOffset);
244
- writeU32(file, recordOffset + 12, table.data.length);
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] << 8 | bytes[offset + 1];
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] << 8 | bytes[offset + 3]) >>> 0;
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 < 32 || byte > 126) return;
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, 4);
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 + 8);
44
- const length = readUint32(bytes, recordOffset + 12);
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 >= 32768 ? value - 65536 : 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, 3);
75
- return bytes[offset] << 16 | bytes[offset + 1] << 8 | bytes[offset + 2];
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, 4);
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] << 8 | bytes[offset + 1];
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] << 8 | bytes[offset + 3]) >>> 0;
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 < 32 || byte > 126) return;
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, 4);
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 + 8);
43
- const length = readUint32(bytes, recordOffset + 12);
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 >= 32768 ? value - 65536 : 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, 3);
74
- return bytes[offset] << 16 | bytes[offset + 1] << 8 | bytes[offset + 2];
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, 4);
87
+ requireBytes(bytes, offset, UINT32_BYTE_COUNT);
78
88
  return readUint32(bytes, offset);
79
89
  }
80
90
  function i32(bytes, offset) {
@@ -1,5 +1,5 @@
1
1
  import { PdfDiagnosticSink } from "./diagnostics.cjs";
2
- import { n as PdfDict } from "./objects-B7HdMeWS.cjs";
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, sink: PdfDiagnosticSink): StructureContext;
10
+ declare function readStructure(catalog: PdfDict, pages: readonly PdfDict[], resolver: Readonly<PdfObjectResolver>, sink: PdfDiagnosticSink): StructureContext;
11
11
  //#endregion
12
12
  export { StructureContext, readStructure };
@@ -1,5 +1,5 @@
1
1
  import { PdfDiagnosticSink } from "./diagnostics.js";
2
- import { n as PdfDict } from "./objects-B7HdMeWS.js";
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, sink: PdfDiagnosticSink): StructureContext;
10
+ declare function readStructure(catalog: PdfDict, pages: readonly PdfDict[], resolver: Readonly<PdfObjectResolver>, sink: PdfDiagnosticSink): StructureContext;
11
11
  //#endregion
12
12
  export { StructureContext, readStructure };