Bounded Cross-Reference Recovery

HotPDF može obnoviti stvarni graf objekata i stablo stranica kada PDF ima deklaraciju startxref koja nedostaje, nevažeća je ili je zastarjela, ili neupotrebljive retke ukrštenih referenci

Slijed oporavka

  1. Normalni loader sukladan specifikaciji izvodi se prvi u zadanom načinu xrrmOnFailure
  2. Obnova skenira izvor u blokovima od 1 MiB s kratkim prenosom između blokova i bilježi provjerene neizravne objekte i sidra ukrštenih referenci
  3. Oznake ugniježđene unutar provjerenog neizravnog objekta odbacuju se, uključujući nizove, komentare, rječnike i binarne podatke toka koji sadrže tekst poput 99 0 obj ili xref
  4. Važeće tablice ili tokovi ukrštenih referenci isprobavaju se od najnovijeg prema najstarijem putem postojećeg inkrementalnog, hibridnog i loadera toka objekata
  5. Zadržava se najviše 4 096 sidara sekcija ukrštenih referenci, sprječavajući da neprijateljsko ponavljanje oznaka množi pokušaje raščlanjivanja
  6. Ako nijedna sekcija ukrštenih referenci ne proizvede stvarno stablo stranica, pomaci neizravnih objekata se ponovno izgrađuju, a duplicirani brojevi objekata koriste najnoviju fizičku definiciju
  7. Obnova uspijeva samo kada se razriješi stvarni Catalog, stablo Pages i barem jedan list stranice

Deklaracije

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;

Konfiguracija

ČlanZadanoSvrha
XRefRecoveryModexrrmOnFailureDisables recovery, runs it only after normal parsing fails, or forces it before normal parsing
XRefRecoveryMaxScanBytes8 GiBTvrdi maksimalna veličina izvora koju prihvaća skeniranje obnove po blokovima
XRefRecoveryMaxObjects2,000,000Hard maximum validated indirect-object candidates accepted by recovery
ParserRecoveryEventLimit1,024Najveći broj strukturnih događaja zadržanih za jedno učitavanje, pri čemu nula onemogućuje zadržavanje događaja

Informacije o oporavku

GetLoadedXRefRecoveryInfo vraća True kada je obnova pokušana i kopira najnoviji zapis THPDFXRefRecoveryInfo

Strukturirani događaji oporavka

GetLoadedParserRecoveryEvents vraća snimku zadržanog toka događaja u vlasništvu pozivatelja, dok GetLoadedParserRecoveryEvent čita jedan unos bez alociranja kopije polja

Informacije o prvenstvu spajanja

GetLoadedXRefMergeInfo vraća True kada je učitavanje toka ukrštenih referenci ili hibridnih referenci naišlo na stanje spajanja vrijedno izvještavanja

Informacije o cjelovitosti

GetLoadedXRefIntegrityInfo izvještava o aktivnom lancu slobodnog popisa, nevažećim vezama, ciklusima, nepovezanim slobodnim unosima, pogreškama prijelaza generacije, dupliciranim živim definicijama i starijim unosima zasjenjenima najnovijom revizijom

Zasjenjeni detalji obuhvaćaju aktivne i odbijene vrste unosa, pomake ili pohranjene podatke, generacije i dubinu revizije, s fiksnom gornjom granicom od 256 unosa

Spremanje oporavljenih dokumenata

Obnovljeni dokument uvijek koristi put punog prepisa u SaveLoadedDocument, čak i kada nijedan objekt nije uređivan, tako da HotPDF nikada ne kopira oštećene izvorne bajtove kao prividno popravljen izlaz

Primjer

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;

Povezani API-ji