Bounded Cross-Reference Recovery

HotPDF kan gendanne en ægte objektgraf og sidetræ, når en PDF mangler en gyldig startxref -deklaration eller har ubrugelige xref-rækker

Gendannelsessekvens

  1. Den almindelige spec-overholdende loader køres først i standardtilstanden xrrmOnFailure -tilstand
  2. Gendannelsen scanner kilden i 1 MiB-blokke med en kort overførsel mellem blokke og noterer validerede indirekte objekter og xref-ankre
  3. Markører, der ligger indlejret i et valideret indirekte objekt, afvises, herunder strenge, kommentarer, ordbøger og binære strømdata, der indeholder tekst som 99 0 obj eller xref
  4. Gyldige xref-tabeller eller -strømme prøves fra nyeste til ældste gennem den eksisterende inkrementelle, hybride og objektstrøm-loader
  5. Højst 4.096 xref-sektionsankre fastholdes, så ondsindet markørgentagelse ikke kan multiplicere fortolkningsforsøg
  6. Hvis ingen xref-sektion giver et ægte sidetræ, genopbygges direkte objektforskydninger, og duplikerede objektnumre bruger den nyeste fysiske definition
  7. Gendannelsen lykkes kun, når en ægte Catalog, Pages-træ og mindst ét sideblad kan opløses

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;

Configuration

MemberDefaultFormål
XRefRecoveryModexrrmOnFailureDeaktiverer gendannelse, kører den kun efter at almindelig fortolkning fejler, eller tvinger den igennem før almindelig fortolkning
XRefRecoveryMaxScanBytes8 GiBHård maksimal kildestørrelse, som den blokopdelte gendannelsesscanning accepterer
XRefRecoveryMaxObjects2,000,000Hårdt maksimum for validerede indirekte objektkandidater, som gendannelsen accepterer
ParserRecoveryEventLimit1,024Maksimalt antal strukturerede hændelser, der fastholdes for én indlæsning, hvor nul deaktiverer hændelsesfastholdelse

Gendannelsesinformation

GetLoadedXRefRecoveryInfo returnerer True , når gendannelse blev forsøgt, og kopierer den seneste THPDFXRefRecoveryInfo record

Strukturerede gendannelseshændelser

GetLoadedParserRecoveryEvents returnerer et kalder-ejet snapshot af den fastholdte hændelsesstrøm, mens GetLoadedParserRecoveryEvent læser ét indslag uden at allokere en array-kopi

Forrangs-information om sammenlægning

GetLoadedXRefMergeInfo returnerer True , når xref-strøm- eller hybridreference-indlæsning stødte på sammenlægningstilstand, der er værd at rapportere

Integritetsinformation

GetLoadedXRefIntegrityInfo rapporterer den aktive fritlistekæde, ugyldige links, cyklusser, ukoblede frie entry'er, fejl i generationsovergange, duplikerede levende definitioner og ældre entry'er, der er overskygget af den nyeste revision

Skyggedetaljer omfatter aktive og afviste entrytyper, forskydninger eller lagerfelter, generationer og revisionsdybde med et fast detaljetag på 256 entry'er

Gemning af gendannede dokumenter

Et gendannet dokument bruger altid fuld-omskrivningsvejen i SaveLoadedDocument , selv når intet objekt blev redigeret, så HotPDF aldrig kopierer beskadigede kildebytes som et tilsyneladende repareret output

Eksempel

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;

Relaterede API'er