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;