Tokenbevarende indholdsstrøm-AST

HPDFContentStream leverer en afgrænset tabsfri syntaksmodel til målrettede redigeringer af afkodede PDF-indholdsstrømme

Parsing og inspektion

HPDFParseContentStreamAST opretter en THPDFContentStreamAST med standardgrænser på 4.194.304 lexemer og 256 indlejrede containere; kaldere, der har brug for strammere grænser, kan kalde THPDFContentStreamAST.Create direkte

THPDFContentLexemeKind skelner mellem whitespace, kommentarer, tal, navne, literale og hexadecimal strenge, booleans, nuller, ord, containerafgrænsere, inline-billeddata og fejlformede bytes; hver inputbyte hører til præcis én THPDFContentLexeme

THPDFContentSyntaxNodeKind skelner mellem roden, operationer, operander, arrays, dictionaries, procedurer, inline-billeder og fejlformede regioner; hver THPDFContentSyntaxNode bruger parent-, first-child-, last-child- og next-sibling-indekser, så traversering ikke allokerer børnearrays

Brug GetLexeme, GetLexemeBytes, GetLexemeText og GetNode sammen med LexemeCount og NodeCount; GetOriginalBytes returnerer en uafhængig kildekopi

Valid, ErrorOffset og ErrorMessage rapporterer fejlform input, samtidig med at byte-eksakt serialisering fastholdes, og GetStatistics fylder THPDFContentASTStatistics med kildestørrelse, tællere, maksimal dybde, antal inline-billeder og antal fejlformede noder

Redigerings-overlays

ReplaceRange bruger halvåbne byte-offsets, mens ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode og InsertAfterNode afleder ranges fra syntax-poster

Hver THPDFContentEdit kopieres ind i et sorteret overlay; konflikterende redigeringer afvises, tilstødende ranges forbliver gyldige, EditCount rapporterer accepterede redigeringer, og ClearEdits gendanner no-op-output

Operator-besøgende

HPDFVisitContentStreamOperators lægger referenceoptalte visitor- og Delphi event-callbacks oven på denne AST, leverer et skrivebeskyttet operand-view, håndhæver kilde-, operator-, lexeme-, dybde- og erstatningsbudgetter og reparser det transformerede output, før den melder succes

Serialisering

Serialize opretter ét output-byte-array efter en overflow-tjekket størrelsesberegning, mens WriteToStream skriver urørte kildespænd og erstatningsspænd direkte til en kalder-ejet TStream

Uden redigeringer genskaber begge veje kilden byte for byte uden at ændre numerisk stavemåde, string-escapes, kommentarer, linjeafslutninger, afgrænsere eller inline-billedpayloads

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;