Bounded Cross-Reference Recovery

Το HotPDF μπορεί να ανακτήσει ένα πραγματικό γράφημα αντικειμένων και δέντρο σελίδων όταν ένα PDF έχει μια λείπουσα, άκυρη, ή stale δήλωση startxref ή μη usable xref rows

Ακολουθία ανάκτησης

  1. Ο κανονικός compliant με την προδιαγραφή φορτωτής τρέχει πρώτα στην προεπιλεγμένη λειτουργία xrrmOnFailure
  2. Η ανάκτηση σαρώνει την πηγή σε τμήματα 1 MiB με μια σύντομη μεταφορά μεταξύ τμημάτων και καταγράφει επικυρωμένα έμμεσα αντικείμενα και xref anchors
  3. Οι δείκτες ένθετοι μέσα σε ένα επικυρωμένο έμμεσο αντικείμενο απορρίπτονται, συμπεριλαμβανομένων strings, σχολίων, λεξικών και binary stream data που περιέχουν κείμενο όπως 99 0 obj ή xref
  4. Έγκυροι πίνακες ή ροές xref δοκιμάζονται από νεότερο προς παλαιότερο μέσω του υπάρχοντος incremental, hybrid και object-stream φορτωτή
  5. Το πολύ 4.096 xref section anchors διατηρούνται, αποτρέποντας την εχθρική επανάληψη δεικτών από τον πολλαπλασιασμό των απόπειρων ανάλυσης
  6. Αν καμία ενότητα xref δεν παράγει ένα πραγματικό δέντρο σελίδων, τα offsets έμμεσων αντικειμένων ανοικοδομούνται και οι διπλοί αριθμοί αντικειμένων χρησιμοποιούν τον νεότερο φυσικό ορισμό
  7. Η ανάκτηση πετυχαίνει μόνο όταν ένα πραγματικό 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;

Διαμόρφωση

ΜέλοςΠροεπιλογήΣκοπός
XRefRecoveryModexrrmOnFailureΑπενεργοποιεί την ανάκτηση, την τρέχει μόνο αφού αποτύχει η κανονική ανάλυση, ή την επιβάλλει πριν από την κανονική ανάλυση
XRefRecoveryMaxScanBytes8 GiBΣκληρό μέγιστο μέγεθος πηγής που γίνεται δεκτό από τη σάρωση ανάκτησης σε τμήματα
XRefRecoveryMaxObjects2.000.000Σκληρό μέγιστο επικυρωμένων υποψηφίων έμμεσων αντικειμένων που γίνονται δεκτά από την ανάκτηση
ParserRecoveryEventLimit1.024Μέγιστος αριθμός δομημένων συμβάντων που διατηρούνται για μία φόρτωση, με το μηδέν να απενεργοποιεί τη διατήρηση συμβάντων

Πληροφορίες ανάκτησης

Η GetLoadedXRefRecoveryInfo επιστρέφει True όταν επιχειρήθηκε ανάκτηση και αντιγράφει την πιο πρόσφατη εγγραφή THPDFXRefRecoveryInfo

Δομημένα συμβάντα ανάκτησης

Η GetLoadedParserRecoveryEvents επιστρέφει στιγμιότυπο της διατηρούμενης ροής συμβάντων που ανήκει στον καλούντα, ενώ η GetLoadedParserRecoveryEvent διαβάζει μία εγγραφή χωρίς να δεσμεύει αντίγραφο πίνακα

Πληροφορίες προηγούχου συγχώνευσης

Η GetLoadedXRefMergeInfo επιστρέφει True όταν η φόρτωση xref-stream ή υβριδικής αναφοράς συνάντησε κατάσταση συγχώνευσης άξια αναφοράς

Πληροφορίες ακεραιότητας

Η 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;

Σχετικά API