AST för innehållsström med bevarade token

HPDFContentStream tillhandahåller en begränsad förlustfri syntaxmodell för riktade redigeringar av avkodade PDF-innehållsströmmar

Parsning och inspektion

HPDFParseContentStreamAST skapar en THPDFContentStreamAST med standardgränser på 4 194 304 lexem och 256 nästlade behållare; anropare som behöver snävare gränser kan anropa THPDFContentStreamAST.Create direkt

THPDFContentLexemeKind skiljer blanktecken, kommentarer, tal, namn, literal- och hexadecimala strängar, booleska värden, nollvärden, ord, behållaravgränsare, inline-bilddata och felformade byte; varje indatabyte tillhör exakt ett THPDFContentLexeme

THPDFContentSyntaxNodeKind skiljer roten, operationer, operander, arrayer, ordlistor, procedurer, inline-bilder och felformade regioner; varje THPDFContentSyntaxNode använder index för förälder, första barn, sista barn och nästa syskon så att genomgången inte allokerar undernode-arrayer

Använd GetLexeme, GetLexemeBytes, GetLexemeText och GetNode med LexemeCount och NodeCount; GetOriginalBytes returnerar en oberoende källkopia

Valid, ErrorOffset och ErrorMessage rapporterar felformad indata samtidigt som byte-exakt serialisering behålls, och GetStatistics fyller THPDFContentASTStatistics med källstorlek, antal, maximalt djup, antal inline-bilder och antal felformade noder

Redigering av överlägg

ReplaceRange använder halvöppna byte-förskjutningar, medan ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode och InsertAfterNode härleder intervall från syntaxposterna

Varje THPDFContentEdit kopieras till ett sorterat överlägg; motstridiga redigeringar avvisas, angränsande intervall förblir giltiga, EditCount rapporterar accepterade redigeringar och ClearEdits återställer utdata utan åtgärd

Operatorbesökare

HPDFVisitContentStreamOperators lägger referensräknade besökare och Delphi-händelseåterupprop ovanpå detta AST, tillhandahåller en skrivskyddad operandvy, verkställer budgetar för källa, operator, lexem, djup och ersättning, samt omtolkar transformerad utdata innan det lyckas

Serialisera

Serialize skapar en utdatabyte-array efter en översvämningskontrollerad storleksberäkning, medan WriteToStream skriver ohanterade källsegment och ersättningsegment direkt till en anroparägd TStream

Utan redigeringar återger båda vägarna källan byte för byte utan att ändra numerisk stavning, strängescape, kommentarer, radslut, avgränsare eller inline-bildnyttolaster

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;