Token-behoudende inhoudsstroom-AST

HPDFContentStream biedt een begrensd verliesvrij syntaxisModel voor gerichte bewerkingen van gedecodeerde PDF-inhoudsstromen

Parseren en inspecteren

HPDFParseContentStreamAST maakt een THPDFContentStreamAST met standaardlimieten van 4.194.304 lexemen en 256 geneste containers; aanroepers die strakkere limieten nodig hebben kunnen THPDFContentStreamAST.Create rechtstreeks aanroepen

THPDFContentLexemeKind onderscheidt witruimte, commentaar, nummers, namen, literale en hexadecimale tekenreeksen, booleans, nullen, woorden, containerscheidingstekens, inline-afbeeldingsdata en misvormde bytes; elke invoerbyte behoort tot exact één THPDFContentLexeme

THPDFContentSyntaxNodeKind onderscheidt de wortel, bewerkingen, operanden, arrays, woordenboeken, procedures, inline-afbeeldingen en misvormde gebieden; elke THPDFContentSyntaxNode gebruikt ouder-, eerste-kind-, laatste-kind- en volgende-broer indexes zodat traversering geen kinderarrays toewijst

Gebruik GetLexeme, GetLexemeBytes, GetLexemeText en GetNode met LexemeCount en NodeCount; GetOriginalBytes geeft een onafhankelijke bronkopie terug

Valid, ErrorOffset en ErrorMessage rapporteren misvormde invoer terwijl byte-exacte serialisatie behouden blijft, en GetStatistics vult THPDFContentASTStatistics met bronsgrootte, aantallen, maximale diepte, inline-afbeeldingaantal en misvormd-knoopaantal

Bewerk overlays

ReplaceRange gebruikt half-open byte-verschuivingen, terwijl ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode en InsertAfterNode bereiken afleiden uit syntaxisrecords

Elke THPDFContentEdit wordt gekopieerd naar een gesorteerde overlay; conflicterende bewerkingen worden geweigerd, aangrenzende bereiken blijven geldig, EditCount rapporteert geaccepteerde bewerkingen, en ClearEdits herstelt no-op uitvoer

Operatorbezoekers

HPDFVisitContentStreamOperators legt referentietelling-bezoeker- en Delphi-gebeurteniscallbacks over deze AST, biedt een alleen-lezen operandweergave, handhaaft bron-, operator-, lexeem-, diepte- en vervangingsbudgetten, en parseert getransformeerde uitvoer opnieuw vóór succes

Serialiseren

Serialize maakt één uitvoerbytearray na een overloopgecontroleerde grootteberekening, terwijl WriteToStream onaangetaste bronbereiken en vervangingsbereiken rechtstreeks naar een in eigendom van de aanroeper zijnde TStream schrijft

Zonder bewerkingen reproduceert elk pad de bron byte voor byte zonder numerieke spelling, tekenreeks-escales, commentaar, regeleinden, scheidingstekens of inline-afbeeldingspayloads te wijzigen

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;