İçeriğe geç

Ast: anlamsal belge ağacı ve serileştirme

Ast modülü, motorun anlamsal belge soyut sözdizimi ağacını (AST) sunar. Bir belgeyi türlenmiş bir düğüm hiyerarşisi olarak modeller: Document, Section, Heading, Paragraph, List, Table, Figure, Code ve FormField. Model, sınırlayıcı kutuları ve alıntı çapalarını kaydeder ve sürümlenmiş JavaScript Object Notation (JSON) biçimine serileştirir. Erişilebilirlik etiketleme katmanı, yapı ağacı üretmek için bu ağacı kullanır.

Kararlılık: deneysel. Bu, dahili bir model yüzeyidir. Sınıfları sürüm sabitlemeli genel API garantileri sunmaz. Düğüm kümesi ve düğüm öznitelikleri değişebilir. Serileştirme şeması bağımsız olarak sürümlenir (AstDocument::CURRENT_SCHEMA_VERSION = '1.0.0'). Serileştirici, uyumsuz bir şemayı algılar ve reddeder; böylece kalıcılaştırılan AST JSON’ı, bellek içi API değişse bile kararlı bir sözleşmeyi korur.

Terminal window
composer require nextpdf/core:^3

Burada AST, bir belgenin mantıksal yapısını temsil eder. Tek bir girdi biçimine yönelik ayrıştırıcı sözdizim ağacı değildir. AstDocument kapsayıcıdır. Kök AstNode düğümünü (NodeType::Document olmak zorundadır), bir şema sürümünü, kaynak Portable Document Format (PDF) dosyasının karmasını ve sayfa sayısını barındırır. Boş bir şema sürümü, birden küçük sayfa sayısı veya yanlış kök türü dahil olmak üzere geçersiz yapılandırmaları reddeder.

AstNode özyinelemeli düğümdür. NodeType anlamsal türleri sıralar. Bir düğüm; alt öğeler, isteğe bağlı bir BoundingBox, isteğe bağlı metin içeriği ve NodeAttributeSchema tarafından doğrulanan öznitelikler taşır. Düğüm API’si değiştirilemez türetmeyi destekler. withBboxAndText() yeni bir düğüm döndürür. deepClone() bir alt ağacı kopyalar. NodeId, kimliği temsil eden değer nesnesidir. CitationAnchor, izlenebilirlik için bir düğümü kaynak konumuna bağlar. AstNodeCollection, Countable/IteratorAggregate arabirimlerini uygulayan ve ofType() ile filtreleme sağlayan bir kümedir.

AstSerializer kalıcılık sınırıdır. serialize() bir AstDocument nesnesini JSON’a yazar. deserialize() onu geri okur. canDeserialize() ve extractSchemaVersion() ayrıştırmadan önce uyumluluğu denetlemenize olanak tanır; böylece şema uyumsuzluğu, bozuk bir yükleme yerine algılanmış bir durum olur. AstDocument::estimateTokenCount() içeriği, akış aşağıdaki belirteç sınırlı işleme için boyutlandırmaya yardımcı olur.

SınıfÖnemli üyelerRol
AstDocumenttoJson(), nodeCount(), estimateTokenCount(), CURRENT_SCHEMA_VERSIONKök kapsayıcı; kök türünü ve şemayı doğrular
AstNodeaddChild(), children(), childCount(), totalNodeCount(), withBboxAndText(), deepClone()Özyinelemeli anlamsal düğüm
NodeType (enum)Document, Heading, Table, Figure, FormField, …Anlamsal düğüm türü
AstNodeCollectionadd(), count(), isEmpty(), ofType(), toArray()Yinelenebilir, türe göre filtrelenebilir düğüm kümesi
AstSerializerserialize(), deserialize(), canDeserialize(), extractSchemaVersion()Sürümlenmiş JSON kalıcılığı
BoundingBoxtoArray(), equals()Geometri değer nesnesi (epsilon karşılaştırması)
NodeId / CitationAnchortoString(), equals(), toArray()Düğüm kimliği ve kaynak izlenebilirliği çapası
NodeAttributeSchemaöznitelik doğrulamasıDüğüm öznitelikleri için şema

Tam PHPDoc tablosunu oluşturmak için composer docs:generate-api-php -- --module=Ast komutunu çalıştırın.

Küçük bir ağaç oluşturun, ardından onu serileştirin.

<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Ast\AstNode;
use NextPDF\Ast\AstSerializer;
use NextPDF\Ast\NodeType;
$root = new AstNode(NodeType::Document);
$heading = new AstNode(NodeType::Heading);
$root->addChild($heading);
$root->addChild(new AstNode(NodeType::Paragraph));
echo "Nodes: {$root->totalNodeCount()}\n";
$json = (new AstSerializer())->serialize(/* an AstDocument wrapping $root */);

Kalıcılaştırılan AST’yi savunmacı biçimde serileştirip geri okuyun. Güvenilmeyen JSON’ı geri okumadan önce şema uyumluluğunu denetleyin.

<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Ast\AstDocument;
use NextPDF\Ast\AstSerializer;
use Psr\Log\LoggerInterface;
final readonly class AstStore
{
public function __construct(
private AstSerializer $serializer,
private LoggerInterface $logger,
) {}
public function load(string $json): ?AstDocument
{
if (!$this->serializer->canDeserialize($json)) {
$this->logger->warning('AST JSON schema incompatible; rejected.', [
'found_schema' => $this->serializer->extractSchemaVersion($json),
'expected' => AstDocument::CURRENT_SCHEMA_VERSION,
]);
return null;
}
return $this->serializer->deserialize($json);
}
}
  • AstDocument kök düğümün NodeType::Document olmasını gerektirir. Başka bir kök içeren ağaç, yapılandırma sırasında özel durum fırlatır.
  • AstNode::withBboxAndText() ve deepClone() yeni örnekler döndürür. Kullanılabilir düğüm değiştiricileri (addChild()) düğümü yerinde değiştirir. Türetme yardımcıları değiştirmez. Hangi yöntemi çağırdığınızı bilin.
  • Dışarıdan gelen JSON için deserialize() çağrısını her zaman canDeserialize() ile koruyun. Bir şema sürümü uyumsuzluğu, algılanabilir ve beklenen bir durumdur.
  • estimateTokenCount() akış aşağıdaki işlemeyi boyutlandırmaya yönelik bir tahmindir, kesin bir belirteç sayımı değildir. Bunu yetkili bir değer olarak görmeyin.
  • BoundingBox::equals() bir epsilon karşılaştırmasıdır (varsayılan 0.001). Kesin kayan nokta eşitliği bir sözleşme değildir.

Ağaç oluşturma ve dolaşma, düğüm sayısında O(n)‘dir. Serileştirme, ağaç boyutunda doğrusaldır. Yeniden üretilebilirlik profili bitwise şeklindedir. Aynı ağaç aynı JSON baytlarına serileştirilir; bu da şemayı bir kalıcılık sözleşmesi olarak kararlı tutar. Varsayılan referans iş yükü, 1500 ms duvar süresi / 64 MB tepe bellek bütçesinin oldukça içinde kalır.

AstSerializer::deserialize() kalıcılaştırılabilen veya iletilebilen JSON’ı ayrıştırır. Uyumluluğu önce canDeserialize() ile doğrulayın. Serileştirilmiş ağacın metin içeriğini ve özniteliklerini, uygulamaya yeniden girdiklerinde veya işlendiklerinde güvenilmeyen dizeler olarak ele alın. Modülün kendisi herhangi bir input/output (I/O) gerçekleştirmez ve harici veri gömmez. Motorun tehdit modeli için /modules/core/security/ sayfasına bakın.

Bu modül, herhangi bir PDF belirtimine ilişkin normatif iddiada bulunmaz. Anlamsal AST, motor içi bir soyutlamadır. Maddelerine atıfta bulunulması gereken standartlaştırılmış bir belge modeli uygulamaz. AST’nin erişilebilirlik etiketlemesini beslediği yerlerde, çıktının PDF/UA ve etiketli PDF uyumluluğu burada değil, /modules/core/accessibility/ ve /modules/core/conformance/ sayfalarında belgelenir ve doğrulanır.