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;