Bounded Cross-Reference Recovery

HotPDF có thể phục hồi một object graph và page tree thực khi một PDF có khai báo startxref bị thiếu, không hợp lệ, hoặc cũ, hoặc có các dòng xref không dùng được

Trình tự phục hồi

  1. Trình nạp tuân thủ chuẩn thông thường chạy trước trong chế độ xrrmOnFailure mặc định
  2. Việc phục hồi quét nguồn theo từng khối 1 MiB với một khoảng mang ngắn giữa các khối và ghi lại các indirect object đã xác thực cùng các mỏ neo xref
  3. Các marker lồng bên trong một indirect object đã xác thực bị từ chối, bao gồm chuỗi, chú thích, từ điển, và dữ liệu luồng nhị phân chứa văn bản như 99 0 obj hoặc xref
  4. Các bảng hoặc luồng xref hợp lệ được thử từ mới nhất đến cũ nhất thông qua trình nạp gia tăng, hybrid, và object-stream hiện có
  5. Tối đa 4.096 mỏ neo section xref được giữ lại, ngăn việc lặp marker đối nghị nhân lên số lần phân tích
  6. Nếu không section xref nào tạo ra một page tree thực, các offset direct-object được dựng lại và các số object trùng lặp dùng định nghĩa vật lý mới nhất
  7. Việc phục hồi chỉ thành công khi một Catalog thực, cây Pages, và ít nhất một page leaf giải được

Khai báo

type
  THPDFXRefRecoveryMode = (
    xrrmDisabled,
    xrrmOnFailure,
    xrrmForce
  );

  THPDFXRefRecoveryStatus = (
    xrrsNotNeeded,
    xrrsSucceeded,
    xrrsDisabled,
    xrrsScanLimitExceeded,
    xrrsObjectLimitExceeded,
    xrrsXRefLimitExceeded,
    xrrsFailed
  );

  THPDFXRefRecoveryMethod = (
    xrrmethodNone,
    xrrmethodRelocatedSection,
    xrrmethodRebuiltObjectOffsets
  );

  THPDFXRefMergeInfo = record
    HybridRevisionCount: Integer;
    HybridOverlapCount: Integer;
    OlderRevisionShadowedEntryCount: Integer;
    DuplicateEntryCount: Integer;
    NewestRevisionPrecedenceApplied: boolean;
    HybridStreamPrecedenceApplied: boolean;
  end;

property XRefRecoveryMode: THPDFXRefRecoveryMode;
property XRefRecoveryMaxScanBytes: Int64;
property XRefRecoveryMaxObjects: Integer;

function GetLoadedXRefRecoveryInfo(
  out Info: THPDFXRefRecoveryInfo
): boolean;

function GetLoadedXRefMergeInfo(
  out Info: THPDFXRefMergeInfo
): boolean;

function GetLoadedXRefIntegrityInfo(
  out Info: THPDFXRefIntegrityInfo
): boolean;

Cấu hình

MemberDefaultPurpose
XRefRecoveryModexrrmOnFailureTắt phục hồi, chỉ chạy sau khi phân tích thường thất bại, hoặc ép chạy trước phân tích thường
XRefRecoveryMaxScanBytes8 GiBKích thước nguồn tối đa cứng mà quét phục hồi theo chunk chấp nhận
XRefRecoveryMaxObjects2,000,000Số ứng dụng đối tượng indirect hợp lệ tối đa cứng mà phục hồi chấp nhận
ParserRecoveryEventLimit1,024Số sự kiện có cấu trúc tối đa giữ lại cho một lần nạp, giá trị không tắt việc giữ sự kiện

Thông tin phục hồi

GetLoadedXRefRecoveryInfo trả về True khi việc phục hồi đã được thử và sao chép bản ghi THPDFXRefRecoveryInfo mới nhất

Sự kiện phục hồi có cấu trúc

GetLoadedParserRecoveryEvents trả về một ảnh chụp caller sở hữu của stream sự kiện giữ lại, trong khi GetLoadedParserRecoveryEvent đọc một mục mà không cấp phát bản sao mảng

Thông tin ưu tiên gộp

GetLoadedXRefMergeInfo trả về True khi việc nạp xref-stream hoặc hybrid-reference gặp trạng thái gộp đáng báo cáo

Thông tin toàn vẹn

GetLoadedXRefIntegrityInfo báo cáo chuỗi free-list đang hoạt động, các link không hợp lệ, vòng lặp, các mục free không liên kết, lỗi chuyển thế hệ, định nghĩa live trùng lặp, và các mục cũ hơn bị che bởi revision mới nhất

Chi tiết bị che bao gồm các loại mục đang hoạt động và bị từ chối, các trường offset hoặc storage, thế hệ, và độ sâu revision, với trần chi tiết cố định 256 mục

Lưu tài liệu đã phục hồi

Một tài liệu đã phục hồi luôn dùng đường dẫn ghi lại đầy đủ trong SaveLoadedDocument, kể cả khi không có object nào được chỉnh sửa, nhờ vậy HotPDF không bao giờ sao chép các byte nguồn hỏng thành một đầu ra có vẻ đã sửa

Ví dụ

var
  Info: THPDFXRefRecoveryInfo;
  PDF: THotPDF;
begin
  PDF := THotPDF.Create(nil);
  try
    PDF.XRefRecoveryMode := xrrmOnFailure;
    PDF.XRefRecoveryMaxScanBytes := Int64(16) * 1024 * 1024 * 1024;
    PDF.XRefRecoveryMaxObjects := 3000000;
    if PDF.LoadFromFile('damaged.pdf') > 0 then
    begin
      if PDF.GetLoadedXRefRecoveryInfo(Info) then
        WriteLn(Info.Diagnostic);
      PDF.SaveLoadedDocument('recovered.pdf');
    end;
  finally
    PDF.Free;
  end;
end;

API liên quan