Visitor для content-операторов

HotPDF открывает каждую операцию декодированного content stream через интерфейс visitor со подсчётом ссылок и Delphi event callback, не требуя от вызывающих писать свой PDF tokenizer

Осмотр и измерение

THPDFContentOperatorEventData различает фазы begin-stream, operator и end-stream и сообщает индекс операции, имя оператора, число операндов, диапазон байтов и детерминированное состояние до выполнения текущего исходного оператора

Состояние содержит глубины graphics state, текстовых объектов, marked content и секций совместимости, а THPDFContentOperatorView выдаёт по запросу read-only байты операции или операнда без копирования всего исходного stream

Преобразование или отвержение

Callback выбирает coaKeep, coaDelete, coaReplace, coaStop или coaReject

Действия delete и replace превращаются в отсортированные непересекающиеся правки AST; отвержение не публикует вывода, а coaStop завершается успешно после текущего оператора

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

Бюджеты и валидация

THPDFContentOperatorVisitOptions.Default настраивает MaxSourceBytes, MaxOperators, MaxLexemes, MaxDepth, MaxReplacementBytes и ValidateOutput

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

Битый ввод, невалидный заменяющий вывод, исключения в callback, превышение лимитов и явное отвержение различаются по THPDFContentOperatorVisitStatus и диагностике

Регистрация на загруженной странице

PDF.ContentOperatorVisitor := Visitor;
PDF.OnContentOperator := HandleContentOperator;
Options := THPDFContentOperatorVisitOptions.Default;
if PDF.VisitLoadedPageContentOperators(0, True, Options,
  CancellationToken, Statistics) then
  UseStatistics(Statistics);

Интерфейсный visitor выполняется до event callback, когда назначены оба, и оба работают синхронно на вызывающем потоке

При ApplyChanges=True HotPDF сначала валидирует весь преобразованный stream, затем заменяет содержимое страницы одной мутацией графа и инвалидирует кэши скомпилированных display-list, raster, disk, декодеров шрифтов и thumbnail

Связанные API