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;