Bounded Cross-Reference Recovery
Το HotPDF μπορεί να ανακτήσει ένα πραγματικό γράφημα αντικειμένων και δέντρο σελίδων όταν ένα PDF έχει μια λείπουσα, άκυρη, ή stale δήλωση startxref ή μη usable xref rows
Ακολουθία ανάκτησης
- Ο κανονικός compliant με την προδιαγραφή φορτωτής τρέχει πρώτα στην προεπιλεγμένη λειτουργία
xrrmOnFailure - Η ανάκτηση σαρώνει την πηγή σε τμήματα 1 MiB με μια σύντομη μεταφορά μεταξύ τμημάτων και καταγράφει επικυρωμένα έμμεσα αντικείμενα και xref anchors
- Οι δείκτες ένθετοι μέσα σε ένα επικυρωμένο έμμεσο αντικείμενο απορρίπτονται, συμπεριλαμβανομένων strings, σχολίων, λεξικών και binary stream data που περιέχουν κείμενο όπως
99 0 objήxref - Έγκυροι πίνακες ή ροές xref δοκιμάζονται από νεότερο προς παλαιότερο μέσω του υπάρχοντος incremental, hybrid και object-stream φορτωτή
- Το πολύ 4.096 xref section anchors διατηρούνται, αποτρέποντας την εχθρική επανάληψη δεικτών από τον πολλαπλασιασμό των απόπειρων ανάλυσης
- Αν καμία ενότητα xref δεν παράγει ένα πραγματικό δέντρο σελίδων, τα offsets έμμεσων αντικειμένων ανοικοδομούνται και οι διπλοί αριθμοί αντικειμένων χρησιμοποιούν τον νεότερο φυσικό ορισμό
- Η ανάκτηση πετυχαίνει μόνο όταν ένα πραγματικό Catalog, δέντρο Pages και τουλάχιστον ένα page leaf επιλύονται
Δηλώσεις
type
THPDFXRefRecoveryMode = (
xrrmDisabled,
xrrmOnFailure,
xrrmForce
);
THPDFXRefRecoveryStatus = (
xrrsNotNeeded,
xrrsSucceeded,
xrrsDisabled,
xrrsScanLimitExceeded,
xrrsObjectLimitExceeded,
xrrsXRefLimitExceeded,
xrrsFailed
);
THPDFXRefRecoveryMethod = (
xrrmethodNone,
xrrmethodRelocatedSection,
xrrmethodRebuiltObjectOffsets
);
THPDFParserRecoveryConfidence = (
prcNone,
prcLow,
prcMedium,
prcHigh,
prcVerified
);
THPDFParserRecoveryEvent = record
Kind: THPDFParserRecoveryEventKind;
Confidence: THPDFParserRecoveryConfidence;
FirstByte: Int64;
EndByte: Int64;
ObjectNumber: Integer;
GenerationNumber: Integer;
Message: AnsiString;
end;
THPDFXRefMergeInfo = record
HybridRevisionCount: Integer;
HybridOverlapCount: Integer;
OlderRevisionShadowedEntryCount: Integer;
DuplicateEntryCount: Integer;
NewestRevisionPrecedenceApplied: boolean;
HybridStreamPrecedenceApplied: boolean;
end;
property XRefRecoveryMode: THPDFXRefRecoveryMode;
property XRefRecoveryMaxScanBytes: Int64;
property XRefRecoveryMaxObjects: Integer;
property ParserRecoveryEventLimit: Integer;
property LoadedParserRecoveryEventCount: Integer;
property LoadedParserRecoveryEventDroppedCount: Integer;
function GetLoadedXRefRecoveryInfo(
out Info: THPDFXRefRecoveryInfo
): boolean;
function GetLoadedParserRecoveryEvents:
THPDFParserRecoveryEventArray;
function GetLoadedParserRecoveryEvent(
Index: Integer;
out EventInfo: THPDFParserRecoveryEvent
): boolean;
function GetLoadedXRefMergeInfo(
out Info: THPDFXRefMergeInfo
): boolean;
function GetLoadedXRefIntegrityInfo(
out Info: THPDFXRefIntegrityInfo
): boolean;
Διαμόρφωση
| Μέλος | Προεπιλογή | Σκοπός |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Απενεργοποιεί την ανάκτηση, την τρέχει μόνο αφού αποτύχει η κανονική ανάλυση, ή την επιβάλλει πριν από την κανονική ανάλυση |
XRefRecoveryMaxScanBytes | 8 GiB | Σκληρό μέγιστο μέγεθος πηγής που γίνεται δεκτό από τη σάρωση ανάκτησης σε τμήματα |
XRefRecoveryMaxObjects | 2.000.000 | Σκληρό μέγιστο επικυρωμένων υποψηφίων έμμεσων αντικειμένων που γίνονται δεκτά από την ανάκτηση |
ParserRecoveryEventLimit | 1.024 | Μέγιστος αριθμός δομημένων συμβάντων που διατηρούνται για μία φόρτωση, με το μηδέν να απενεργοποιεί τη διατήρηση συμβάντων |
Πληροφορίες ανάκτησης
Η GetLoadedXRefRecoveryInfo επιστρέφει True όταν επιχειρήθηκε ανάκτηση και αντιγράφει την πιο πρόσφατη εγγραφή THPDFXRefRecoveryInfo
- Το
Statusδιακρίνει επιτυχία, απενεργοποιημένη ανάκτηση, αποτυχία ορίου bytes, αποτυχία ορίου αντικειμένων, αποτυχία ορίου xref-anchor και δομική αποτυχία - Το
Methodπροσδιορίζει μια μετατοπισμένη ενότητα xref ή ανοικοδομημένα offsets έμμεσων αντικειμένων - Τα
BytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCountκαιXRefCandidateCountεκθέτουν οριοθετημένη εργασία και ποιότητα ανάκτησης - Το
SelectedXRefOffsetπροσδιορίζει τη μετατοπισμένη ενότητα όταν αυτή η μέθοδος πετυχαίνει - Το
Diagnosticπεριέχει μια σύντομη αγγλική περιγραφή αποτελέσματος
Δομημένα συμβάντα ανάκτησης
Η GetLoadedParserRecoveryEvents επιστρέφει στιγμιότυπο της διατηρούμενης ροής συμβάντων που ανήκει στον καλούντα, ενώ η GetLoadedParserRecoveryEvent διαβάζει μία εγγραφή χωρίς να δεσμεύει αντίγραφο πίνακα
- Το
Kindδιακρίνει συμβάντα προσπάθειας, πολιτικής, ορίου, υποψηφίου αντικειμένου, υποψηφίου xref, επιλεγμένης ενότητας, ανοικοδομημένων offsets, επιτυχίας και αποτυχίας - Το
FirstByteείναι συμπεριληπτικό και τοEndByteαποκλειστικό, με αμφότερα στο-1όταν δεν υπάρχει περιοχή πηγής - Τα
ObjectNumberκαιGenerationNumberπροσδιορίζουν υποψήφια έμμεσα αντικείμενα και χρησιμοποιούν-1για συμβάντα επιπέδου εγγράφου ή xref-anchor - Το
Confidenceεξελίσσεται απόprcNoneσε χαμηλά, μεσαία, υψηλά και επαληθευμένα αποτελέσματα - Το
LoadedParserRecoveryEventDroppedCountαναφέρει συμβάντα που παραλείφθηκαν μετά το ρυθμισμένο όριο διατήρησης, διατηρώντας οριοθετημένη μνήμη για εχθρικές εισόδους
Πληροφορίες προηγούχου συγχώνευσης
Η GetLoadedXRefMergeInfo επιστρέφει True όταν η φόρτωση xref-stream ή υβριδικής αναφοράς συνάντησε κατάσταση συγχώνευσης άξια αναφοράς
- Το
HybridRevisionCountμετρά παραδοσιακές αναθεωρήσεις που συνείσφεραν μια side xref ροή μέσω/XRefStm - Το
HybridOverlapCountμετρά εγγραφές πίνακα ήδη παρεχόμενες από την xref ροή της ίδιας αναθεώρησης, που έχει προτεραιότητα - Το
OlderRevisionShadowedEntryCountμετρά εγγραφές που αγνοήθηκαν επειδή μια νεότερη αναθεώρηση όριζε ήδη αυτόν τον αριθμό αντικειμένου - Το
DuplicateEntryCountμετρά επαναλαμβανόμενες εγγραφές μέσα στη νεότερη μη υβριδική ενότητα - Οι δύο σημαίες προηγούχου δηλώνουν αν ο αντίστοιχος κανόνας ασκήθηκε αντί να είναι απλώς διαθέσιμος
Πληροφορίες ακεραιότητας
Η GetLoadedXRefIntegrityInfo αναφέρει την ενεργή αλυσίδα ελεύθερης λίστας, άκυρους συνδέσμους, κύκλους, ασύνδετες ελεύθερες εγγραφές, σφάλματα μετάβασης γενιάς, διπλούς ενεργούς ορισμούς και παλαιότερες εγγραφές που επισκιάστηκαν από τη νεότερη αναθεώρηση
Η λεπτομέρεια επισκιασμένων εγγραφών περιλαμβάνει ενεργούς και απορριφθέντες τύπους εγγραφών, offsets ή πεδία αποθήκευσης, γενιές και βάθος αναθεώρησης, με σταθερό ανώτατο όριο 256 λεπτομερειών
Αποθήκευση ανακτημένων εγγράφων
Ένα ανακτημένο έγγραφο χρησιμοποιεί πάντα τη διαδρομή πλήρους ξanaγράμματος στο SaveLoadedDocument, ακόμη και όταν κανένα αντικείμενο δεν τροποποιήθηκε, ώστε το HotPDF να μην αντιγράφει ποτέ κατεστραμμένα bytes πηγής ως μια φαινομενικά επισκευασμένη έξοδο
Παράδειγμα
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;