Bounded Cross-Reference Recovery

HotPDF kan återställa en verklig objektgraf och ett sidträd när en PDF saknar startxref -deklaration eller har oanvändbara xref-rader

Återställningssekvens

  1. Den normala specifikationstroga laddaren körs först i standard xrrmOnFailure -läget
  2. Återställningen skannar källan i 1 MiB-chunkar med en kort överlapp mellan chunkar och registrerar validerade indirekta objekt och xref-ankaren
  3. Markörer som nästlats inuti ett validerat indirekt objekt avvisas, inklusive strängar, kommentarer, ordlistor och binära strömdata som innehåller text som 99 0 obj eller xref
  4. Giltiga xref-tabeller eller -strömmar provas från nyaste till äldsta via den befintliga laddaren för inkrementella, hybrida och objektströmmar
  5. Högst 4 096 xref-sektionsankaren behålls, vilket hindrar fientlig markörupprepning från att mångfaldiga parseförsök
  6. Om ingen xref-sektion ger upphov till ett verkligt sidträd byggs direkta objektoffset om och duplicerade objektnummer använder den senaste fysiska definitionen
  7. Återställningen lyckas bara när en verklig Catalog, ett Pages-träd och minst ett sidblad kan resolvas

Deklarationer

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;

Konfiguration

MedlemStandardvärdeSyfte
XRefRecoveryModexrrmOnFailureStänger av återställning, kör den bara efter att normal parsning misslyckats, eller tvingar fram den före normal parsning
XRefRecoveryMaxScanBytes8 GiBHård maximal källstorlek som den chunkbaserade återställningsskanningen accepterar
XRefRecoveryMaxObjects2,000,000Hård maximal mängd validerade kandidater för indirekta objekt som återställningen accepterar
ParserRecoveryEventLimit1,024Maximal mängd strukturerade händelser som behålls för en inläsning, där noll stänger av händelselagring

Återställningsinformation

GetLoadedXRefRecoveryInfo returnerar True när återställning försökts och kopierar den senaste THPDFXRefRecoveryInfo -posten

Strukturerade återställningshändelser

GetLoadedParserRecoveryEvents returnerar en anroparägd ögonblicksbild av den behållna händelseströmmen, medan GetLoadedParserRecoveryEvent läser en post utan att allokera en arraykopia

Information om sammanslagningsföreträde

GetLoadedXRefMergeInfo returnerar True när inläsning via xref-ström eller hybridreferens påträffade fusionstillstånd värt att rapportera

Integritetsinformation

GetLoadedXRefIntegrityInfo rapporterar den aktiva fri-list-kedjan, ogiltiga länkar, cykler, olänkade fria poster, fel i generationsövergångar, duplicerade levande definitioner och äldre poster som skuggats av den nyaste revisionen

Skuggdetaljen omfattar aktiva och avvisade posttyper, offset- eller lagringsfält, generationer och revisionsdjup, med ett fast detaljtak på 256 poster

Att spara återställda dokument

Ett återställt dokument använder alltid vägen full omskrivning i SaveLoadedDocument, även när inget objekt redigerats, så att HotPDF aldrig kopierar skadade källbyte som en till synes reparerad utdata

Exempel

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;

Relaterade API:er