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
- Den almindelige spec-overholdende loader køres først i standardtilstanden
xrrmOnFailure-tilstand - Gendannelsen scanner kilden i 1 MiB-blokke med en kort overførsel mellem blokke og noterer validerede indirekte objekter og xref-ankre
- 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 objellerxref - Gyldige xref-tabeller eller -strømme prøves fra nyeste til ældste gennem den eksisterende inkrementelle, hybride og objektstrøm-loader
- Højst 4.096 xref-sektionsankre fastholdes, så ondsindet markørgentagelse ikke kan multiplicere fortolkningsforsøg
- Hvis ingen xref-sektion giver et ægte sidetræ, genopbygges direkte objektforskydninger, og duplikerede objektnumre bruger den nyeste fysiske definition
- 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
| Member | Default | Formål |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Deaktiverer gendannelse, kører den kun efter at almindelig fortolkning fejler, eller tvinger den igennem før almindelig fortolkning |
XRefRecoveryMaxScanBytes | 8 GiB | Hård maksimal kildestørrelse, som den blokopdelte gendannelsesscanning accepterer |
XRefRecoveryMaxObjects | 2,000,000 | Hårdt maksimum for validerede indirekte objektkandidater, som gendannelsen accepterer |
ParserRecoveryEventLimit | 1,024 | Maksimalt 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
Statusadskiller success, deaktiveret gendannelse, fejl ved bytegrænse, fejl ved objektgrænse, fejl ved xref-ankergrænse og strukturel fejlMethodidentificerer en flyttet xref-sektion eller genopbyggede direkte objektforskydningerBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCount, ogXRefCandidateCounteksponerer afgrænset arbejde og gendannelseskvalitetSelectedXRefOffsetidentificerer den flyttede sektion, når den metode lykkesDiagnosticindeholder en kortfattet engelsk resultatbeskrivelse
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
Kindadskiller forsøgs-, politik-, grænse-, objektkandidat-, xref-kandidat-, valgt sektion-, genopbyggede forskydnings-, success- og fejlhændelserFirstByteer inklusiv, ogEndByteer eksklusiv, med begge sat til-1, når intet kildedområde findesObjectNumberogGenerationNumberidentificerer indirekte objektkandidater og bruger-1til dokumentniveau- eller xref-anker-hændelserConfidenceskrider frem fraprcNonegennem lave, mellem-, høje og verificerede udfaldLoadedParserRecoveryEventDroppedCountrapporterer hændelser, der er udeladt efter den konfigurerede fastholdelsesgrænse, og bevarer afgrænset hukommelse ved fjendtlige input
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
HybridRevisionCounttæller traditionelle revisioner, der bidrog med en sideordnet xref-strøm gennem/XRefStmHybridOverlapCounttæller tabel-entry'er, der allerede var leveret af samme revisions xref-strøm, som har forrangOlderRevisionShadowedEntryCounttæller entry'er, der blev ignoreret, fordi en nyere revision allerede havde defineret det objektnummerDuplicateEntryCounttæller gentagne entry'er i den nyeste ikke-hybride sektion- De to forrangflag angiver, om den tilsvarende regel faktisk blev anvendt og ikke blot var tilgængelig
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;