Referencias cruzadas headless

HPDFHeadlessXRef aporta la indexación validada de xref-streams y object-streams que usa THPDFHeadlessDocument; los diccionarios y cabeceras de object-stream usan el parser de objetos compartido, mientras que los campos big-endian usan el lector de bytes Direct File compartido

HPDFHeadlessDecodeXRefRows(Dictionary, DecodedBytes, MaxObjects, CancellationToken) lee entradas directas Type, Size, W y la Index opcional después de que el llamante haya decodificado filtros y predictores

THPDFHeadlessXRefRows es un array de registros THPDFHeadlessXRefRow que contienen ObjectNumber y la THPDFDirectXrefEntry compartida como Entry; las clases de entrada cero, uno y dos identifican objetos libres, directos y comprimidos

Las anchuras van de cero a ocho bytes, los campos omitidos usan los valores por defecto PDF, los offsets conservan precisión Int64, y los solapes de subsecciones, los desajustes de longitud de payload, las generaciones fuera de rango y los overflow sin signo se rechazan antes de indexar objetos

HPDFHeadlessReadObjectStreamIndex(Dictionary, DecodedBytes, MaxObjects, MaxDecodedBytes, CancellationToken) valida Type=ObjStm, N y First directos, y luego parsea la cabecera numérica a través del parser compartido

THPDFHeadlessObjectStreamMembers es un array de registros THPDFHeadlessObjectStreamMember con ObjectNumber, Offset del payload decodificado base cero y Length positivo; los números de objeto duplicados, los pares no enteros, los offsets inválidos y los presupuestos configurados se rechazan

HPDFHeadlessObjectStreamBody(Members, DecodedBytes, MemberIndex, ExpectedObjectNumber) devuelve el slice exacto del miembro tras comprobar el número de miembro del xref autoritativo contra la cabecera de su contenedor; el llamante del documento parsea ese slice a través del parser compartido

EHPDFHeadlessXRefError informa de un mensaje y un flag de solo lectura LimitExceeded, mientras que la cancelación lanza EHPDFOperationCancelled; los llamantes son dueños de los diccionarios y buffers decodificados, y los arrays devueltos contienen registros de valor

El provider se encarga de la indexación de bytes y la validación; la precedencia de revisiones, la fusión de side-sections híbridas, la decodificación de filtros, el descifrado, la caché de objetos y la propiedad del documento siguen en el loader del documento

Valores numéricos exactos

El parser compartido retiene el token original del source cuando la conversión a Single redondearía el valor o su magnitud supera 16777216; los lectores de enteros de referencias cruzadas y object-streams prefieren ese token para offsets e índices Int64 exactos, mientras que los enteros exactos pequeños conservan la ruta eficiente en asignaciones

Los tests usan el writer compartido y PDFs independientes de objetos comprimidos, cubren offsets de 40 bits, anchuras/valores por defecto, predictores, rangos dispersos, precedencia híbrida, índices de miembros mal formados y ciclos de revisión, y preservan los umbrales originales de asignación y throughput del parser