Versioned JSON для графа объектов: туда и обратно
HotPDF умеет стримить полный граф загруженных indirect-объектов в versioned JSON и восстанавливать из него редактируемый документ, не превращая значения PDF в описание задачи
Схема и совместимость
Текущая схема HotPDF-object-graph-2 записывает schemaVersion, minimumReaderVersion, версию PDF, ссылки trailer Root и Info, каждый выбранный indirect-объект, идентификаторы удалённых объектов и вид — snapshot или incremental
Для совместимости reader принимает более ранний формат HotPDF-object-graph-1 и отклоняет будущие или несовместимые версии схемы до того, как тронет целевой документ
Для редактирования с полным циклом туда-обратно используйте stream API v2, потому что только v2 записывает, являются данные stream payload сырыми отфильтрованными или уже декодированными
Streaming и бинарные payload
ExportLoadedObjectGraphJSONToStream пишет объекты и рекурсивно упорядоченные значения PDF прямо в выходной stream, не собирая JSON-строку размером с документ
Сырые или декодированные байты stream можно опустить, встроить как chunked base64 или записать sidecar-файлами в указанном каталоге
Имена sidecar — безопасные имена листьев, публикация выполняется через соседний временный файл с последующей атомарной заменой, а импорт отклоняет traversal- и абсолютные пути
Importer читает вход блоками фиксированного размера и материализует за раз только одну запись top-level объекта, соблюдая лимиты на байты JSON, количество и номер объектов, глубину значений, байты строк, отдельные stream и суммарные байты stream
Режимы snapshot и incremental
Snapshot экспортирует полный граф, а ogjimReplace валидирует документ-кандидат перед подменой целевого
Инкрементальный экспорт содержит только dirty-, must-write- и удалённые объекты; ogjimUpdate проверяет ссылки на объединении существующего графа и дельты, а затем коммитит через механизм транзакций загруженного графа
Любое повреждённое значение, неразрешённая ссылка, невалидное дерево Catalog или Pages, несогласованная длина direct- или indirect-stream, исчерпанный бюджет или неудачное чтение sidecar оставляют целевой документ нетронутым
Граница безопасности
JSON-граф содержит объекты PDF и связи trailer Root и Info, но никогда не экспортирует пароли, ключи шифрования или активное состояние security handler
Поэтому заменённый snapshot остаётся незашифрованным, пока приложение явно не настроит защиту вывода перед сохранением