Token-Preserving Content-Stream AST

HPDFContentStream מספק מודל תחביר חסום וחסר אובדן לעריכות ממוקדות של זרמי תוכן PDF ‏מפוענחים

פענוח ובחינה

HPDFParseContentStreamAST יוצר THPDFContentStreamAST עם מגבלות ברירת מחדל של 4,194,304 lexemes ‏ו-256 מיכלים מקוננים; קוראים שזקוקים למגבלות הדוקות יותר יכולים לקרוא ישירות ל-THPDFContentStreamAST.Create

THPDFContentLexemeKind מבדיל רווח לבן, הערות, מספרים, שמות, מחרוזות literal ‏והקסדצימליות, booleans, nulls, מילים, מפרידי מיכלים, נתוני תמונה מוטמעת ו-bytes ‏פגומים; כל byte ‏קלט שייך בדיוק ל-THPDFContentLexeme ‏אחד

THPDFContentSyntaxNodeKind מבדיל שורש, פעולות, אופרנדים, מערכים, מילונים, procedures, תמונות מוטמעות ואזורים פגומים; כל THPDFContentSyntaxNode משתמש באינדקסים של הורה, צאצא ראשון, צאצא אחרון ואח-הבא, כך שהמעבר לא מקצה מערכי צאצאים

השתמשו ב-GetLexeme, GetLexemeBytes, GetLexemeText ו-GetNode יחד עם LexemeCount ו-NodeCount; GetOriginalBytes מחזיר עותק בלתי תלוי של המקור

Valid, ErrorOffset ו-ErrorMessage מדווחים על קלט פגום תוך שמירה על סריאליזציה מדויקת byte-by-byte, ו-GetStatistics ממלא את THPDFContentASTStatistics בגודל המקור, הספירות, העומק המרבי, מספר התמונות המוטמעות ומספר הצמתים הפגומים

שכבות-על של עריכות

ReplaceRange משתמש בקיזוזי bytes ‏חצי-פתוחים, ואילו ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode ו-InsertAfterNode גוזרים טווחים מרשומות התחביר

כל THPDFContentEdit מועתק לשכבת-על ממוינת; עריכות מתנגשות נדחות, טווחים סמוכים נשארים תקינים, EditCount מדווח על העריכות שהתקבלו, ו-ClearEdits מחזיר את הפלט ל-no-op

מבקרי אופרטורים

HPDFVisitContentStreamOperators מציג מבקרים עם ספירת הפניות ו-callbacks ‏של אירועי Delphi ‏מעל ה-AST ‏הזה, מספק תצוגת אופרנדים לקריאה בלבד, אוכף תקציבי מקור, אופרטור, lexeme, עומק והחלפה, ומפענח מחדש את הפלט המותמר לפני הצלחה

סריאליזציה

Serialize יוצר מערך bytes ‏אחד של פלט אחרי חישוב גודל עם בדיקת גלישה, ואילו WriteToStream כותב מקטעי מקור שלא נגעו בהם ומקטעי החלפה ישירות ל-TStream ‏בבעלות הקורא

ללא עריכות, שתי הדרכים משחזרות את המקור byte ‏אחר byte בלי לשנות איות מספרי, escape ‏של מחרוזות, הערות, סופי שורות, מפרידים או payload ‏של תמונות מוטמעות

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;