Recupero dei riferimenti incrociati limitato

HotPDF può recuperare un grafo degli oggetti e un albero delle pagine reali quando un PDF ha una dichiarazione startxref dichiarazione o righe xref inutilizzabili

Sequenza di recupero

  1. Il loader normale conforme alle specifiche viene eseguito per primo nella modalità predefinita xrrmOnFailure mode
  2. Il recupero scansiona la sorgente in blocchi da 1 MiB con un breve riporto tra i blocchi e registra gli oggetti indiretti validati e le ancore xref
  3. I marker annidati all'interno di un oggetto indiretto validato vengono rifiutati, incluse stringhe, commenti, dizionari e dati binari dei flussi contenenti testo come 99 0 obj o xref
  4. Le tabelle o i flussi xref validi vengono provati dal più recente al più vecchio tramite il loader incrementale, ibrido e object-stream esistente
  5. Vengono conservate al massimo 4.096 ancore di sezione xref, impedendo che la ripetizione avversaria di marker moltiplichi i tentativi di analisi
  6. Se nessuna sezione xref produce un albero delle pagine reale, gli offset degli oggetti diretti vengono ricostruiti e i numeri oggetto duplicati utilizzano la definizione fisica più recente
  7. Il recupero riesce solo quando risolvono un Catalog reale, un albero Pages e almeno una foglia di pagina

Dichiarazioni

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;

Configurazione

MembroPredefinitoScopo
XRefRecoveryModexrrmOnFailureDisabilita il recupero, lo esegue solo dopo il fallimento dell'analisi normale o lo forza prima dell'analisi normale
XRefRecoveryMaxScanBytes8 GiBDimensione massima assoluta della sorgente accettata dalla scansione di recupero a blocchi
XRefRecoveryMaxObjects2.000.000Massimo rigido di candidati a oggetti indiretti validati accettati dal recupero
ParserRecoveryEventLimit1,024Massimo numero di eventi strutturati trattenuti per un caricamento, con zero che disabilita la ritenzione degli eventi

Informazioni di recupero

GetLoadedXRefRecoveryInfo restituisce True quando è stato tentato un recupero e copia il record THPDFXRefRecoveryInfo più recente

Eventi di recupero strutturati

GetLoadedParserRecoveryEvents restituisce un'istantanea di proprietà del chiamante dello stream di eventi trattenuto, mentre GetLoadedParserRecoveryEvent legge una voce senza allocare una copia dell'array

Informazioni sulla precedenza del merge

GetLoadedXRefMergeInfo restituisce True quando il caricamento di flussi xref o di riferimenti ibridi ha incontrato uno stato di unione degno di segnalazione

Salvataggio dei documenti recuperati

GetLoadedXRefIntegrityInfo riporta la catena attiva di free-list, link non validi, cicli, voci libere non collegate, errori di transizione di generazione, definizioni live duplicate e voci più vecchie oscurate dalla revisione più recente

Il dettaglio oscurato include tipi di voce attivi e rifiutati, offset o campi di storage, generazioni e profondità di revisione, con un tetto fisso di 256 voci di dettaglio

Salvataggio dei documenti recuperati

Un documento recuperato usa sempre il percorso di riscrittura completa in SaveLoadedDocument, anche quando nessun oggetto è stato modificato, così che HotPDF non copii mai byte sorgente danneggiati come output apparentemente riparato

Esempio

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 correlate