Token-Preserving Content-Stream AST
HPDFContentStream cung cấp một mô hình cú pháp không mất dữ liệu bị giới hạn cho các chỉnh sửa có mục tiêu trên các stream nội dung PDF đã giải mã
Phân tích cú pháp và kiểm tra
HPDFParseContentStreamAST tạo một THPDFContentStreamAST với các giới hạn mặc định là 4.194.304 lexeme và 256 vùng chứa lồng nhau; người gọi cần giới hạn chặt hơn có thể gọi trực tiếp THPDFContentStreamAST.Create
THPDFContentLexemeKind phân biệt khoảng trắng, chú thích, số, tên, chuỗi ký tự và thập lục phân, boolean, null, từ, dấu phân cách vùng chứa, dữ liệu ảnh nội tuyến và byte sai định dạng; mỗi byte đầu vào thuộc chính xác một THPDFContentLexeme
THPDFContentSyntaxNodeKind phân biệt gốc, thao tác, toán hạng, mảng, từ điển, thủ tục, ảnh nội tuyến và vùng sai định dạng; mỗi THPDFContentSyntaxNode dùng các chỉ mục cha, con đầu, con cuối và anh em kế để duyệt không cấp phát mảng con
Dùng GetLexeme, GetLexemeBytes, GetLexemeText và GetNode cùng với LexemeCount và NodeCount; GetOriginalBytes trả về một bản sao độc lập của nguồn
Valid, ErrorOffset và ErrorMessage báo cáo input sai định dạng trong khi vẫn giữ serialization khớp từng byte, còn GetStatistics điền vào THPDFContentASTStatistics kích thước nguồn, các bộ đếm, độ sâu tối đa, số inline image và số node sai định dạng
Lớp phủ chỉnh sửa
ReplaceRange dùng byte offset nửa mở, còn ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode và InsertAfterNode suy ra range từ các syntax record
Mỗi THPDFContentEdit được sao chép vào một overlay đã sắp xếp; các edit xung đột bị từ chối, các range liền kề vẫn hợp lệ, EditCount báo số edit đã được chấp nhận, và ClearEdits khôi phục output như khi chưa có thao tác nào
Trình duyệt toán tử
HPDFVisitContentStreamOperators xếp lớp các trình duyệt đếm tham chiếu và callback sự kiện Delphi lên AST này, cung cấp một chế độ xem toán hạng chỉ đọc, thực thi các ngân sách nguồn, toán tử, lexeme, độ sâu và thay thế, đồng thời phân tích cú pháp lại đầu ra đã biến đổi trước khi thành công
Tuần tự hóa
Serialize tạo một mảng byte đầu ra sau khi tính kích thước có kiểm tra tràn, trong khi WriteToStream ghi các span nguồn không đụng tới và span thay thế trực tiếp vào một TStream do người gọi sở hữu
Không có chỉnh sửa, một trong hai đường dẫn tái tạo nguồn từng byte mà không thay đổi cách viết số, escape chuỗi, chú thích, kết thúc dòng, dấu phân cách hoặc tải trọng ảnh nội tuyến
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;