Token-Preserving Content-Stream AST

HPDFContentStream یک مدل نحوی بی‌ضرر و محدود برای ویرایش‌های هدفمند روی content streamهای رمزگشایی‌شده PDF فراهم می‌کند

تجزیه و بازرسی

HPDFParseContentStreamAST یک THPDFContentStreamAST با سقف‌های پیش‌فرض ۴٬۱۹۴٬۳۰۴ lexeme و ۲۵۶ ظرف تودرتو می‌سازد؛ فراخوان‌کنندگانی که سقف‌های سخت‌گیرانه‌تر می‌خواهند می‌توانند مستقیماً THPDFContentStreamAST.Create را صدا بزنند

THPDFContentLexemeKind فاصله‌های سفید، توضیحات، اعداد، نام‌ها، رشته‌های literal و hexadecimal، بولین‌ها، nullها، کلمات، جداکننده‌های ظرف، دادهٔ inline-image و بایت‌های بدشکل را متمایز می‌کند؛ هر بایت ورودی دقیقاً به یک THPDFContentLexeme تعلق دارد

THPDFContentSyntaxNodeKind ریشه، عملگرها، عملوندها، آرایه‌ها، دیکشنری‌ها، رویه‌ها، تصاویر درون‌خطی و نواحی بدشکل را متمایز می‌کند؛ هر THPDFContentSyntaxNode از شاخص‌های والد، نخستین فرزند، آخرین فرزند و خواهر بعدی استفاده می‌کند تا پیمایش آرایهٔ فرزند تخصیص ندهد

GetLexeme، GetLexemeBytes، GetLexemeText و GetNode را همراه با LexemeCount و NodeCount به کار ببرید؛ GetOriginalBytes نسخه‌ای مستقل از منبع برمی‌گرداند

Valid، ErrorOffset و ErrorMessage ورودی بدشکل را گزارش می‌کنند، آن هم در حالی که سریال‌سازی بایت‌به‌بایت حفظ می‌شود، و GetStatistics ساختار THPDFContentASTStatistics را با اندازه منبع، شمارش‌ها، بیشینه عمق، تعداد inline-image و تعداد گره‌های بدشکل پر می‌کند

لایه‌های ویرایش

ReplaceRange از آفست‌های بایتی نیم‌باز استفاده می‌کند، در حالی که ReplaceLexeme، ReplaceNode، DeleteNode، InsertBeforeNode و InsertAfterNode بازه‌ها را از رکوردهای نحوی مشتق می‌کنند

هر THPDFContentEdit در یک overlay مرتب‌شده کپی می‌شود؛ ویرایش‌های متعارض رد می‌شوند، بازه‌های مجاورت معتبر می‌مانند، EditCount ویرایش‌های پذیرفته‌شده را گزارش می‌کند و ClearEdits خروجی بدون‌عمل را بازمی‌گرداند

بازدیدکننده‌های عملگر

HPDFVisitContentStreamOperators بازدیدکننده‌های با شمارش ارجاع و callbackهای رویداد Delphi را روی همین AST سوار می‌کند، نمای فقط‌خواندنی عملوندها را فراهم می‌کند، بودجه‌های منبع، عملگر، lexeme، عمق و جای‌گزینی را تحمیل می‌کند و پیش از اعلام موفقیت، خروجی تبدیل‌شده را دوباره تجزیه می‌کند

سریال‌سازی

Serialize پس از محاسبه اندازه با بررسی سرریز، یک آرایهٔ بایتی خروجی می‌سازد، در حالی که WriteToStream بازه‌های دست‌نخورده منبع و بازه‌های جای‌گزین را مستقیماً در TStream متعلق به فراخوان می‌نویسد

بدون ویرایش، هر دو مسیر منبع را بایت‌به‌بایت بازتولید می‌کنند، بدون آنکه املای اعداد، escapeهای رشته‌ای، توضیحات، پایان خطوط، جداکننده‌ها یا payloadهای inline-image تغییر کند

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;