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
- Den normala specifikationstroga laddaren körs först i standard
xrrmOnFailure-läget - Återställningen skannar källan i 1 MiB-chunkar med en kort överlapp mellan chunkar och registrerar validerade indirekta objekt och xref-ankaren
- 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 objellerxref - Giltiga xref-tabeller eller -strömmar provas från nyaste till äldsta via den befintliga laddaren för inkrementella, hybrida och objektströmmar
- Högst 4 096 xref-sektionsankaren behålls, vilket hindrar fientlig markörupprepning från att mångfaldiga parseförsök
- Om ingen xref-sektion ger upphov till ett verkligt sidträd byggs direkta objektoffset om och duplicerade objektnummer använder den senaste fysiska definitionen
- Å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
| Medlem | Standardvärde | Syfte |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Stänger av återställning, kör den bara efter att normal parsning misslyckats, eller tvingar fram den före normal parsning |
XRefRecoveryMaxScanBytes | 8 GiB | Hård maximal källstorlek som den chunkbaserade återställningsskanningen accepterar |
XRefRecoveryMaxObjects | 2,000,000 | Hård maximal mängd validerade kandidater för indirekta objekt som återställningen accepterar |
ParserRecoveryEventLimit | 1,024 | Maximal 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
Statusskiljer mellan framgång, avstängd återställning, brott mot bytegräns, brott mot objektgräns, brott mot xref-ankargräns och strukturellt misslyckandeMethodidentifierar en flyttad xref-sektion eller ombyggda direkta objektoffsetBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCountochXRefCandidateCountexponerar avgränsat arbete och återställningskvalitetSelectedXRefOffsetidentifierar den flyttade sektionen när den metoden lyckasDiagnosticinnehåller en koncis resultatbeskrivning på engelska
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
Kindskiljer mellan händelser för försök, policy, gräns, objektkandidat, xref-kandidat, vald sektion, ombyggda offset, framgång och misslyckandeFirstByteär inklusive ochEndByteär exklusivt, med båda satta till-1när inget källintervall finnsObjectNumberochGenerationNumberidentifierar kandidater för indirekta objekt och använder-1för händelser på dokumentnivå eller xref-ankareConfidencegår frånprcNonegenom utfallen låg, medel, hög och verifieradLoadedParserRecoveryEventDroppedCountrapporterar händelser som utelämnats efter den konfigurerade lagringsgränsen och bevarar avgränsat minne vid fientlig indata
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
HybridRevisionCounträknar traditionella revisioner som bidrog med en sidoxref-ström via/XRefStmHybridOverlapCounträknar tabellposter som redan lämnats av samma revisions xref-ström, som har företrädeOlderRevisionShadowedEntryCounträknar poster som ignorerats för att en nyare revision redan definierat det objektnumretDuplicateEntryCounträknar upprepade poster inuti den nyaste icke-hybridsektionen- De två företrädesflaggorna anger om motsvarande regel faktiskt tillämpades i stället för bara att vara tillgänglig
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;