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
- Il loader normale conforme alle specifiche viene eseguito per primo nella modalità predefinita
xrrmOnFailuremode - 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
- 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 objoxref - Le tabelle o i flussi xref validi vengono provati dal più recente al più vecchio tramite il loader incrementale, ibrido e object-stream esistente
- Vengono conservate al massimo 4.096 ancore di sezione xref, impedendo che la ripetizione avversaria di marker moltiplichi i tentativi di analisi
- 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
- 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
| Membro | Predefinito | Scopo |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Disabilita il recupero, lo esegue solo dopo il fallimento dell'analisi normale o lo forza prima dell'analisi normale |
XRefRecoveryMaxScanBytes | 8 GiB | Dimensione massima assoluta della sorgente accettata dalla scansione di recupero a blocchi |
XRefRecoveryMaxObjects | 2.000.000 | Massimo rigido di candidati a oggetti indiretti validati accettati dal recupero |
ParserRecoveryEventLimit | 1,024 | Massimo 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
Statusdistingue tra successo, recupero disabilitato, fallimento del limite di byte, fallimento del limite di oggetti, fallimento del limite di ancore xref e fallimento strutturaleMethodidentifica una sezione xref ricollocata o offset degli oggetti diretti ricostruitiBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCounteXRefCandidateCountespongono il lavoro limitato e la qualità del recuperoSelectedXRefOffsetidentifica la sezione ricollocata quando quel metodo riesceDiagnosticcontiene una concisa descrizione del risultato in inglese
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
Kinddistingue eventi di tentativo, policy, limite, candidato oggetto, candidato xref, sezione selezionata, offset ricostruiti, successo e fallimentoFirstByteè inclusivo edEndByteè esclusivo, con entrambi impostati a-1quando non esiste un intervallo sorgenteObjectNumbereGenerationNumberidentificano i candidati a oggetti indiretti e usano-1per eventi a livello documento o ancorati alla xrefConfidenceprogredisce daprcNoneattraverso gli esiti basso, medio, alto e verificatoLoadedParserRecoveryEventDroppedCountriporta gli eventi omessi dopo il limite di ritenzione configurato, preservando memoria limitata su input ostili
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
HybridRevisionCountconta le revisioni tradizionali che hanno contribuito con un flusso xref laterale tramite/XRefStmHybridOverlapCountconta le voci di tabella già fornite dal flusso xref della stessa revisione, che ha la precedenzaOlderRevisionShadowedEntryCountconta le voci ignorate perché una revisione più recente aveva già definito quel numero oggettoDuplicateEntryCountconta le voci ripetute all'interno della sezione non ibrida più recente- I due flag di precedenza indicano se la regola corrispondente è stata effettivamente applicata piuttosto che solo disponibile
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;