Token Korumalı Content-Stream AST

HPDFContentStream, decode edilmiş PDF content stream'lerine yönelik hedefli düzenlemeler için sınırlı ve kayıpsız bir syntax modeli sunar

Ayrıştırma ve inceleme

HPDFParseContentStreamAST, varsayılan olarak 4,194,304 lexeme ve 256 iç içe container limitiyle bir THPDFContentStreamAST oluşturur; daha sıkı limite ihtiyaç duyan çağıranlar THPDFContentStreamAST.Create metodunu doğrudan çağırabilir

THPDFContentLexemeKind; whitespace, yorumlar, sayılar, isimler, literal ve hexadecimal string'ler, boolean'lar, null'lar, kelimeler, container ayraçları, inline-image verisi ve bozuk byte'lar arasında ayrım yapar; her input byte'ı tam olarak bir THPDFContentLexeme'e aittir

THPDFContentSyntaxNodeKind; root, operation'lar, operand'lar, array'ler, dictionary'ler, procedure'lar, inline image'lar ve bozuk bölgeler arasında ayrım yapar; her THPDFContentSyntaxNode parent, first-child, last-child ve next-sibling indekslerini kullanır, böylece gezinme sırasında child array'leri için bellek ayrılmaz

GetLexeme, GetLexemeBytes, GetLexemeText ve GetNode metodlarını LexemeCount ve NodeCount ile birlikte kullanın; GetOriginalBytes bağımsız bir kaynak kopyası döndürür

Valid, ErrorOffset ve ErrorMessage, byte düzeyinde birebir serialization'ı korurken bozuk input'u raporlar; GetStatistics ise THPDFContentASTStatistics yapısını kaynak boyutu, sayaçlar, maksimum derinlik, inline-image sayısı ve bozuk node sayısıyla doldurur

Düzenleme overlay'leri

ReplaceRange yarım açık byte offset'leri kullanır; ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode ve InsertAfterNode ise aralıkları syntax kayıtlarından türetir

Her THPDFContentEdit, sıralı bir overlay'e kopyalanır; çakışan düzenlemeler reddedilir, komşu aralıklar geçerli kalır, EditCount kabul edilen düzenlemeleri raporlar ve ClearEdits çıktıyı no-op hâline döndürür

Operator visitor'ları

HPDFVisitContentStreamOperators, bu AST'nin üzerine reference-counted visitor ve Delphi event callback'leri ekler, salt okunur bir operand görünümü sağlar, kaynak, operator, lexeme, derinlik ve replacement bütçelerini uygular ve başarıyı bildirmeden önce dönüştürülmüş çıktıyı yeniden ayrıştırır

Serialize

Serialize, taşma denetimli bir boyut hesabının ardından tek bir output byte array'i oluşturur; WriteToStream ise dokunulmamış kaynak span'lerini ve replacement span'lerini doğrudan çağıranın sahiplendiği bir TStream'e yazar

Düzenleme yokken her iki yol da kaynağı byte byte yeniden üretir; sayı yazımı, string escape'leri, yorumlar, satır sonları, ayraçlar veya inline-image payload'ları değişmez

var
  AST: THPDFContentStreamAST;
  Output: TBytes;
begin
  AST:= HPDFParseContentStreamAST(ContentBytes);
  try
    if AST.Valid and AST.ReplaceRange(StartOfs, EndOfs, ReplacementBytes) then
      AST.Serialize(Output);
  finally
    AST.Free;
  end;
end;