MCPcopy Create free account
hub / github.com/LibPDF-js/core / parseSubsection

Method parseSubsection

src/parser/xref-parser.ts:345–391  ·  view source on GitHub ↗

* Parse a single subsection of the xref table.

(entries: Map<number, XRefEntry>)

Source from the content-addressed store, hash-verified

343 * Parse a single subsection of the xref table.
344 */
345 private parseSubsection(entries: Map<number, XRefEntry>): void {
346 // Read first object number and count
347 const firstObjNum = this.readIntegerFromCurrent();
348
349 if (firstObjNum === null) {
350 throw new XRefParseError("Expected subsection start object number");
351 }
352
353 this.skipWhitespaceFromCurrent();
354
355 const count = this.readIntegerFromCurrent();
356
357 if (count === null) {
358 throw new XRefParseError("Expected subsection entry count");
359 }
360
361 this.skipWhitespaceFromCurrent();
362
363 // Read entries
364 const parsedEntries: XRefEntry[] = [];
365
366 for (let i = 0; i < count; i++) {
367 parsedEntries.push(this.parseEntry());
368 }
369
370 // Detect off-by-one in subsection start: some malformed PDFs report
371 // firstObjNum=1 when the entries actually start at object 0.
372 // The free list head (generation 65535, type free) is always object 0,
373 // so if we see it at position 1, correct it. (Same fix as pdf.js #3248/#7229)
374 let correctedFirstObjNum = firstObjNum;
375
376 if (
377 firstObjNum === 1 &&
378 parsedEntries.length > 0 &&
379 parsedEntries[0].type === "free" &&
380 parsedEntries[0].generation === 65535
381 ) {
382 correctedFirstObjNum = 0;
383 console.warn(
384 "XRef: corrected subsection start from 1 to 0 (free list head at wrong position)",
385 );
386 }
387
388 for (let i = 0; i < parsedEntries.length; i++) {
389 entries.set(correctedFirstObjNum + i, parsedEntries[i]);
390 }
391 }
392
393 /**
394 * Parse a single xref entry.

Callers 1

parseTableMethod · 0.95

Calls 6

parseEntryMethod · 0.95
pushMethod · 0.80
warnMethod · 0.45
setMethod · 0.45

Tested by

no test coverage detected