AST de flux de conținut care păstrează token-urile

HPDFContentStream oferă un model de sintaxă fără pierderi și mărginit pentru editări țintite ale fluxurilor de conținut PDF decodate

Parsare și inspectare

HPDFParseContentStreamAST creează un THPDFContentStreamAST cu limite implicite de 4,194,304 lexeme și 256 de containere imbricate; apelanții care au nevoie de limite mai stricte pot apela THPDFContentStreamAST.Create direct

THPDFContentLexemeKind distinge spații albe, comentarii, numere, nume, șiruri literale și hexazecimale, booleeni, null-uri, cuvinte, delimitatori de containere, date de imagini inline și octeți malformați; fiecare octet de intrare aparține exact unui THPDFContentLexeme

THPDFContentSyntaxNodeKind distinge rădăcina, operațiile, operanzii, tablourile, dicționarele, procedurile, imaginile inline și regiunile malformate; fiecare THPDFContentSyntaxNode folosește indexuri de părinte, primul copil, ultimul copil și următorul frate, astfel încât traversarea să nu aloce tablouri de copii

Utilizați GetLexeme, GetLexemeBytes, GetLexemeText și GetNode cu LexemeCount și NodeCount; GetOriginalBytes returnează o copie independentă a sursei

Valid, ErrorOffset și ErrorMessage raportează intrarea malformată păstrând serializarea exactă la octet, iar GetStatistics completează THPDFContentASTStatistics cu dimensiunea sursei, numărători, adâncimea maximă, numărul de imagini inline și numărul de noduri malformate

Editarea suprapunerilor

ReplaceRange folosește decalaje de octeți jumătate-deschise, în timp ce ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode și InsertAfterNode derivă intervale din înregistrările de sintaxă

Fiecare THPDFContentEdit este copiat într-un strat sortat; editările conflictuale sunt respinse, intervalele adiacente rămân valide, EditCount raportează editările acceptate, iar ClearEdits restaurează ieșirea fără operație

Vizitatori de operatori

HPDFVisitContentStreamOperators suprapune callback-uri de vizitator cu numărare de referințe și evenimente Delphi peste acest AST, oferă o vizualizare read-only a operanzilor, aplică bugete de sursă, operator, lexem, adâncime și înlocuire și reparsează ieșirea transformată înainte de succes

Serialize

Serialize creează un tablou de octeți de ieșire după un calcul de dimensiune verificat la depășire, în timp ce WriteToStream scrie intervalele de sursă neatinse și intervalele de înlocuire direct într-un TStream deținut de apelant

Fără editări, oricare dintre căi reproduce sursa octet cu octet, fără a schimba ortografia numerică, escape-urile de șir, comentariile, sfârșiturile de linie, delimitatorii sau payload-urile de imagini inline

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;