Разбор простых объектов на основе span-представлений

Модуль HPDFParser разбирает автономные PDF-словари и массивы без копирования подстрок токенов и вложенных контейнеров

Точки входа

function HPDFParserParseSimpleDictionary(
  const Data: AnsiString;
  RecursionLevel: Integer = 0): THPDFDictionaryObject;

function HPDFParserParseSimpleDictionaryWithStatistics(
  const Data: AnsiString;
  out Statistics: THPDFParserViewStatistics;
  RecursionLevel: Integer = 0): THPDFDictionaryObject;

function HPDFParserParseSimpleArray(
  const Data: AnsiString): THPDFArrayObject;

function HPDFParserParseSimpleArrayWithStatistics(
  const Data: AnsiString;
  out Statistics: THPDFParserViewStatistics): THPDFArrayObject;

Возвращённый словарь или массив принадлежит вызывающему коду и содержит обычные постоянные объекты HotPDF, без какой-либо зависимости от времени жизни исходной строки

Статистика представлений

THPDFParserViewStatistics раскрывает поля SourceBytes, TokenViewCount, MaterializedStringCount, MaterializedBytes, ObjectCount, ContainerCount, MaxDepth, ErrorCount и Valid

Token view — это счётчик ограниченных диапазонов источника, а счётчики материализованных строк учитывают байты, скопированные в долговременные PDF-имена, ключи и строки

Поддерживаемые объекты

Парсер распознаёт имена, целые и вещественные числа, булевы значения, null, косвенные ссылки, литеральные строки, шестнадцатеричные строки, массивы и словари

Литеральные строки сохраняют вложенные скобки, экранированные разделители, восьмеричные escape-последовательности и экранированные переносы строк; пробельные символы PDF и комментарии игнорируются

Неэкранированные концы строк CR, CRLF и LF внутри литеральных строк декодируются в один LF на каждый конец строки; экранированные возвраты каретки вроде \r или \015 остаются байтами CR, а экранированные продолжения строк backslash-ом не добавляют ни байта

Вложенные контейнеры делят один курсор по неизменяемому вводу, глубина рекурсии ограничена, а дубликаты ключей словаря заменяют прежние значения с учётом регистра

Повреждённые разделители сдвигают курсор восстановления, не пропуская соседние валидные токены; тело массива без открывающей скобки также восстанавливается после лишних закрывающих скобок и сообщает о них в ErrorCount

Характеристики производительности

Имена и строки материализуются один раз на границе своего постоянного объекта, числа читаются напрямую из байтов источника, а локальный для операции индекс с открытой адресацией не даёт квадратичных повторных обходов при построении больших словарей

Регрессионный набор Win32 на 30,000 пар сократил аллокации за пять проходов с 50,866,510 до 17,936,800 байт, а время выполнения — с 3,656 мс до 46 мс

См. также: Scalable and Random-Access PDF Loading, Bounded PDF Parser Budgets