Разбор простых объектов на основе 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