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
- Trình nạp tuân thủ chuẩn thông thường chạy trước trong chế độ
xrrmOnFailuremặc định - 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
- 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 objhoặcxref - 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ó
- 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
- 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
- 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
| Member | Default | Purpose |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Tắ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 |
XRefRecoveryMaxScanBytes | 8 GiB | Kích thước nguồn tối đa cứng mà quét phục hồi theo chunk chấp nhận |
XRefRecoveryMaxObjects | 2,000,000 | Số ứng dụng đối tượng indirect hợp lệ tối đa cứng mà phục hồi chấp nhận |
ParserRecoveryEventLimit | 1,024 | Số 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
Statusphân biệt thành công, phục hồi bị vô hiệu hóa, thất bại do giới hạn byte, thất bại do giới hạn object, thất bại do giới hạn mỏ neo xref, và thất bại cấu trúcMethodnhận dạng một section xref đã tái định vị hoặc các offset direct-object đã dựng lạiBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCount, vàXRefCandidateCountbộc lộ khối lượng công việc có giới hạn và chất lượng phục hồiSelectedXRefOffsetnhận dạng section đã tái định vị khi phương thức đó thành côngDiagnosticchứa một mô tả kết quả tiếng Anh ngắn gọn
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
Kindphân biệt các sự kiện lần thử, chính sách, giới hạn, ứng cử đối tượng, ứng cử xref, section đã chọn, offset đã dựng lại, thành công và thất bạiFirstBytelà bao gồm vàEndBytelà loại trừ, cả hai đặt bằng-1khi không tồn tại vùng nguồnObjectNumbervàGenerationNumbernhận diện các ứng cử đối tượng indirect và dùng-1cho các sự kiện mức tài liệu hoặc mỏ neo xrefConfidenceđi từprcNonequa các kết quả thấp, trung bình, cao và đã xác minhLoadedParserRecoveryEventDroppedCountbáo các sự kiện bị bỏ sau giới hạn giữ lại đã cấu hình, giữ bộ nhớ có giới hạn với các đầu vào thù địch
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
HybridRevisionCountđếm các revision truyền thống đã đóng góp một side xref stream thông qua/XRefStmHybridOverlapCountđếm các mục bảng đã được cung cấp bởi xref stream của cùng revision đó, vốn được ưu tiênOlderRevisionShadowedEntryCountđếm các mục bị bỏ qua vì một revision mới hơn đã định nghĩa số object đóDuplicateEntryCountđếm các mục lặp lại bên trong section non-hybrid mới nhất- Hai cờ ưu tiên phát biểu xem quy tắc tương ứng có được thực thi hay chỉ mới khả dụng
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;