Токен-зберігальне AST потоку вмісту
HPDFContentStream надає обмежену безвтратну синтаксичну модель для цілеспрямованого редагування декодованих потоків вмісту PDF
Розбір та огляд
HPDFParseContentStreamAST створює THPDFContentStreamAST із типовими межами 4,194,304 лексем і 256 вкладених контейнерів; викликачі, яким потрібні вужчі межі, можуть викликати THPDFContentStreamAST.Create безпосередньо
THPDFContentLexemeKind розрізняє пропуски, коментарі, числа, імена, рядкові та шістнадцяткові літерали, булеві значення, null-значення, слова, розділювачі контейнерів, дані вбудованих зображень і пошкоджені байти; кожен вхідний байт належить рівно одній лексемі THPDFContentLexeme
THPDFContentSyntaxNodeKind розрізняє корінь, операції, операнди, масиви, словники, процедури, вбудовані зображення та пошкоджені регіони; кожен вузол THPDFContentSyntaxNode використовує індекси батька, першого нащадка, останнього нащадка та наступного брата, тому обхід не виділяє масиви нащадків
Використовуйте GetLexeme, GetLexemeBytes, GetLexemeText та GetNode разом із LexemeCount і NodeCount; GetOriginalBytes повертає незалежну копію джерела
Valid, ErrorOffset та ErrorMessage звітують про пошкоджений вхід, зберігаючи серіалізацію, точну до байта, а GetStatistics заповнює THPDFContentASTStatistics розміром джерела, кількостями, максимальною глибиною, кількістю вбудованих зображень та кількістю пошкоджених вузлів
Накладання редагувань
ReplaceRange використовує напіввідкриті байтові зсуви, тоді як ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode та InsertAfterNode виводять діапазони з синтаксичних записів
Кожне THPDFContentEdit копіюється у відсортоване накладання; конфліктні редагування відхиляються, суміжні діапазони залишаються дійсними, EditCount звітує прийняті редагування, а ClearEdits відновлює вихідний матеріал без операцій
Відвідувачі операторів
HPDFVisitContentStreamOperators нашаровує зворотні виклики відвідувача з підрахунком посилань і події Delphi на це AST, надає перегляд операндів лише для читання, забезпечує бюджети джерела, оператора, лексем, глибини та заміни та повторно розбирає перетворений результат перед успіхом
Серіалізація
Serialize створює один вихідний масив байтів після перевіреного на переповнення розрахунку розміру, тоді як WriteToStream записує незаймані діапазони джерела та діапазони заміни безпосередньо у належний викликачеві TStream
Без редагувань будь-який шлях відтворює джерело байт за байтом, не змінюючи числового написання, екранованих послідовностей рядків, коментарів, закінчень рядків, розділювачів чи корисних навантажень вбудованих зображень
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;