Перейти к содержимому
getnextpdf.com

Pro редакция

Interop — глубокий справочник

Эта страница — справочник контрактного уровня для NextPDF\Pro\Interop\V1. Модуль содержит четырнадцать публичных символов: один контракт сериализации (InteropResultInterface), один страж целостности для CI (SchemaLock), три DTO результата верхнего уровня (ExtractedText, DocumentSegmentation, FormData) и девять вспомогательных объектов-значений и перечислений. Каждый DTO — это неизменяемое, сериализуемое в JSON представление одного результата анализа. Форма данных на проводе версионирована и заблокирована; ничто на этой поверхности не запускает анализ повторно. Ориентированное на задачи представление находится на странице возможности.

Эта возможность поставляется в NextPDF Pro (nextpdf/pro) и активируется лицензионным конвертом уровня Pro. Развёртывание без этого права доступа не загружает классы возможности. Сравните редакции и получите лицензию.

Ни один рантайм-флаг возможности не закрывает этот модуль. Классы доступны всегда, когда nextpdf/pro установлен и лицензирован.

СимволПараметрыПоведение по умолчаниюВозвращаетБросает или завершается ошибкой сПримечания
InteropResultInterfaceКонтракт для DTO результата верхнего уровня; расширяет JsonSerializableНе бросает исключенийSCHEMA_VERSION — это строка '1.0'.
InteropResultInterface::toArray()нетСериализует в JSON-безопасный массив, всегда несущий schema_versionarray<string, mixed>Не бросает исключенийРеализации также выдают дискриминатор type.
InteropResultInterface::toJson()int $flags = 0Кодирует вывод toArray(); JSON_THROW_ON_ERROR всегда добавляется через ORstringJsonException на некодируемых данныхПередавайте флаги, такие как JSON_PRETTY_PRINT.
SchemaLock::verify()нетХеширует V1 schema.json на диске и сравнивает с заблокированным SHA-256boolНе бросает исключенийfalse, когда файл схемы отсутствует, нечитаем или изменён.
SchemaLock::expectedHash()нетВозвращает заблокированный хешstringНе бросает исключенийДиагностический вывод для разбора сбоя в CI.
SchemaLock::actualHash()нетВозвращает хеш текущего файла схемыstringНе бросает исключенийСтроки-сигналы FILE_NOT_FOUND / READ_FAILED заменяют хеш при ошибке ввода-вывода.
BoundingBoxfloat $x, float $y, float $width, float $heightНеизменяемый прямоугольник в точках пользовательского пространства PDF, начало координат в левом нижнем углуНе бросает исключенийarea(), overlaps(), toArray(), fromArray().
DocumentInfoint $pageCount плюс шесть необязательных полей метаданныхНеизменяемые метаданные документаНе бросает исключенийfromArray() проверяет тип каждого поля; отсутствующие поля откатываются к значениям по умолчанию.
PageInfoint $pageNumber, float $width, float $height, int $rotation = 0Неизменяемые метаданные страницыНе бросает исключенийisLandscape(); fromArray() приводит числовые строки и числа с плавающей точкой.
ExtractedTextlist<ExtractedPage> $pages, DocumentInfo $documentInfo, float $processingTimeMs = 0.0Результат извлечения текста по всему документуТолько JsonException из toJson()page(), totalBlockCount(), plainText(), fromArray().
ExtractedPagePageInfo $pageInfo, list<TextBlock> $textBlocksПостраничный контейнер текстовых блоков в порядке чтенияНе бросает исключенийplainText() соединяет содержимое блоков одиночными пробелами.
TextBlockstring $content, BoundingBox $boundingBox, int $pageNumber, string $fontName = '', float $fontSize = 0.0Позиционированный непрерывный участок текстаНе бросает исключенийИмя и размер шрифта определяются по мере возможности (доминирующий шрифт в блоке).
DocumentSegmentationlist<Segment> $segments, DocumentInfo $documentInfo, float $processingTimeMs = 0.0Результат сегментации с учётом макетаТолько JsonException из toJson()segmentCount(), ofType(), onPage(), contentSegments(), fromArray().
SegmentSegmentType $type, string $content, BoundingBox $boundingBox, int $pageNumber, float $confidence = 1.0, list<Segment> $children = []Классифицированная область страницы; дочерние элементы вкладываются рекурсивноНе бросает исключенийПорог isHighConfidence() равен 0.8; descendantCount() рекурсивен.
SegmentTypeперечисление на основе строкиДвенадцать вариантов, от heading до unknownНе бросает исключенийisContent() и isStructural() разбивают варианты на группы.
FormDatalist<FormField> $fields, DocumentInfo $documentInfo, float $processingTimeMs = 0.0Результат извлечения формы по всему документуТолько JsonException из toJson()field(), dataFields(), filledCount(), toKeyValueMap(), fromArray().
FormFieldstring $name, FormFieldType $type, плюс шесть необязательных полейОдно извлечённое поле формыНе бросает исключенийisFilled() — это value !== ''.
FormFieldTypeперечисление на основе строкиВосемь вариантов, от text до buttonНе бросает исключенийisDataField() равно false для button и signature.
interface InteropResultInterface extends JsonSerializable
public const SCHEMA_VERSION = '1.0';
public function toArray(): array;
public function toJson(int $flags = 0): string;
final class SchemaLock
public static function verify(): bool
public static function expectedHash(): string
public static function actualHash(): string
final readonly class ExtractedText implements InteropResultInterface
public function __construct(
public array $pages,
public DocumentInfo $documentInfo,
public float $processingTimeMs = 0.0,
)
public function page(int $pageNumber): ?ExtractedPage
public function totalBlockCount(): int
public function plainText(): string
public static function fromArray(array $data): self
final readonly class DocumentSegmentation implements InteropResultInterface
public function __construct(
public array $segments,
public DocumentInfo $documentInfo,
public float $processingTimeMs = 0.0,
)
public function ofType(SegmentType $type): array
public function onPage(int $pageNumber): array
public function contentSegments(): array
public static function fromArray(array $data): self
final readonly class FormData implements InteropResultInterface
public function __construct(
public array $fields,
public DocumentInfo $documentInfo,
public float $processingTimeMs = 0.0,
)
public function field(string $name): ?FormField
public function dataFields(): array
public function toKeyValueMap(): array
public static function fromArray(array $data): self
  • Версионированный конверт. Каждый DTO верхнего уровня (ExtractedText, DocumentSegmentation, FormData) реализует InteropResultInterface. Вывод его toArray() всегда несёт schema_version ('1.0') и дискриминатор type: extracted_text, document_segmentation или form_data.
  • Кодирование JSON. toJson() делегирует json_encode с JSON_THROW_ON_ERROR, добавленным через OR к флагам вызывающего. jsonSerialize() делегирует toArray(), поэтому json_encode($dto) производит ту же форму.
  • Детерминированная сериализация. Порядок ключей и форма фиксированы DTO. Segment::toArray() опускает ключ children, когда он пуст; FormField::toArray() опускает bounding_box, когда он null. Потребители должны считать оба ключа необязательными.
  • Круговой обход. Каждый DTO предоставляет статический fromArray(), принимающий декодированный объект JSON. Поля проверяются по типу на этой межпроцессной границе: отсутствующие или неверно типизированные значения откатываются к документированным значениям по умолчанию вместо бросания исключения.
  • Откаты перечислений. Нераспознанная строка type отображается в SegmentType::Unknown в Segment::fromArray() и в FormFieldType::Text в FormField::fromArray().
  • Координаты. Координаты BoundingBox — это единицы пользовательского пространства PDF (точки, 1/72 дюйма) с началом координат в левом нижнем углу страницы. Номера страниц везде отсчитываются от единицы.
  • Соединение обычного текста. ExtractedPage::plainText() соединяет содержимое блоков одиночными пробелами. ExtractedText::plainText() соединяет страницы пустыми строками ("\n\n").
  • Запросы сегментации. ofType(), onPage() и contentSegments() фильтруют только сегменты верхнего уровня и возвращают переиндексированные списки. contentSegments() выбирает типы, для которых SegmentType::isContent() равно true: heading, sub_heading, paragraph, table, list, code.
  • Запросы формы. FormData::dataFields() и toKeyValueMap() исключают типы полей, не являющиеся данными (button, signature). filledCount() считает поля, значение которых является непустой строкой.
  • Блокировка схемы. SchemaLock::verify() читает V1 schema.json, поставляемый с пакетом, нормализует CRLF в LF, хеширует с SHA-256 и сравнивает с заблокированной константой за постоянное время. CI использует это для блокировки молчаливого дрейфа схемы; значение блокировки меняется только при намеренном версионированном изменении схемы.
  • Политика версионирования. Поверхность V1 — это явный публичный контракт. Аддитивные изменения повышают версию схемы; ломающие изменения требуют новой основной версии.
  • Единственный бросающий исключения член на этой поверхности — toJson(): JsonException, когда массив не поддаётся кодированию, например при некорректном UTF-8 в извлечённом содержимом.
  • SchemaLock::verify() возвращает false — никогда не бросает исключений, — когда файл схемы отсутствует, нечитаем или изменён. Сравните expectedHash() с actualHash(), чтобы отличить дрейф от ошибки ввода-вывода.
  • Откаты fromArray() молчаливы по замыслу. Неверно типизированный page_number становится 1; неверно типизированный confidence становится значением по умолчанию. Проверяйте данные выше по потоку, когда сфабрикованные значения по умолчанию неприемлемы.
  • Приведение числовых строк асимметрично. PageInfo::fromArray() принимает числовые строки для своих полей int и float; Segment и TextBlock принимают только int или float для confidence и font_size.
  • BoundingBox::fromArray() требует все четыре ключа согласно своей документированной форме массива. DTO, которые его встраивают, подставляют нулевой прямоугольник (или null для FormField), когда ключ-обёртка отсутствует.
  • ExtractedPage::fromArray() подставляет запасной page_info со страницей 1 размером 595 × 842 точки, когда ключ отсутствует или неверно типизирован.
  • FormField::fromArray() принимает только строгие булевы значения для required и read_only; истинностные строки и целые числа отображаются в false.
  • Дочерние элементы Segment рекурсируют без ограничения глубины. Крайне глубокая вложенность ограничена только лимитами памяти и стека PHP.
  • В этом модуле не происходит операций с криптографическими ключами или подписями. SchemaLock использует SHA-256 исключительно как контрольную сумму целостности файла, поэтому специфического для режима FIPS поведения нет.

Interop V1 — это версионированный проводной контракт, принадлежащий NextPDF. Он не реализует внешний стандарт, поэтому нормативной таблицы цитирования нет. Семантика BoundingBox согласуется с моделью координат пользовательского пространства PDF, которую используют производящие подсистемы Core; это утверждение о структурном согласовании, а не результат теста на соответствие. NextPDF не имеет никакой сертификации и не предоставляет её.

  • Ветвитесь по schema_version у потребителей. Считайте аддитивные ключи совместимыми; явно отклоняйте неизвестные основные версии.
  • Запускайте SchemaLock::verify() в CI. При сбое логируйте expectedHash() и actualHash() и требуйте намеренного версионированного изменения схемы, а никогда правки на месте.
  • Для межпроцессных круговых обходов декодируйте с ассоциативными массивами (json_decode($json, true)) и передавайте результат в соответствующий fromArray().
  • Все DTO являются final и readonly. Расширяйте через композицию; выводите новые представления из публичных полей.
  • toKeyValueMap() уплощает только поля, несущие данные. Читайте поля signature напрямую из FormData::$fields, когда их наличие важно.
  • Повторное использование безопасно: DTO не хранят изменяемого состояния и ресурсов, поэтому их можно кешировать, разделять между запросами и сериализовать многократно.

Эта страница документирует только внешне наблюдаемое поведение и поддерживаемую публичную поверхность API. Внутренние пути пространств имён, вспомогательные классы, таблицы механизмов, имена файлов runbook и префиксы тикетов находятся вне области рассмотрения.