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;