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
- Normalni loader sukladan specifikaciji izvodi se prvi u zadanom načinu
xrrmOnFailure - 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
- 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 objilixref - Važeće tablice ili tokovi ukrštenih referenci isprobavaju se od najnovijeg prema najstarijem putem postojećeg inkrementalnog, hibridnog i loadera toka objekata
- 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
- 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
- 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
| Član | Zadano | Svrha |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Disables recovery, runs it only after normal parsing fails, or forces it before normal parsing |
XRefRecoveryMaxScanBytes | 8 GiB | Tvrdi maksimalna veličina izvora koju prihvaća skeniranje obnove po blokovima |
XRefRecoveryMaxObjects | 2,000,000 | Hard maximum validated indirect-object candidates accepted by recovery |
ParserRecoveryEventLimit | 1,024 | Najveć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
Statusrazlikuje uspjeh, onemogućenu obnovu, neuspjeh zbog ograničenja bajtova, neuspjeh zbog ograničenja objekata, neuspjeh zbog ograničenja sidara ukrštenih referenci i strukturni neuspjehMethodidentificira premještenu sekciju ukrštenih referenci ili ponovno izgrađene pomake neizravnih objekataBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCountiXRefCandidateCountizlažu ograničeni rad i kvalitetu obnoveSelectedXRefOffsetidentificira premještenu sekciju kada ta metoda uspijeDiagnosticsadrži sažeti opis rezultata na engleskom
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
Kindrazlikuje događaje pokušaja, pravila, ograničenja, kandidata objekata, kandidata ukrštenih referenci, odabrane sekcije, ponovno izgrađenih pomaka, uspjeha i neuspjehaFirstByteje uključiv, aEndByteisključiv, pri čemu su oboje postavljeni na-1kada ne postoji izvorni rasponObjectNumberiGenerationNumberidentificiraju kandidate neizravnih objekata i koriste-1za događaje na razini dokumenta ili sidra ukrštenih referenciConfidencenapreduje odprcNonepreko ishoda niskog, srednjeg i visokog stupnja do provjerenog ishodaLoadedParserRecoveryEventDroppedCountizvještava o događajima izostavljenima nakon konfiguriranog ograničenja zadržavanja, čuvajući ograničenu memoriju na neprijateljskim ulazima
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
HybridRevisionCountbroji tradicionalne revizije koje su pridonijele bočnom toku ukrštenih referenci putem/XRefStmHybridOverlapCountbroji unose tablice koje je već dostavio tok ukrštenih referenci iste revizije, koji ima prednostOlderRevisionShadowedEntryCountbroji unose zanemarene jer je novija revizija već definirala taj broj objektaDuplicateEntryCountbroji ponovljene unose unutar najnovije nehhibridne sekcije- Dvije zastavice prioriteta navode je li odgovarajuće pravilo primijenjeno, a ne samo dostupno
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;