Ograniczone odzyskiwanie odsyłaczy krzyżowych
HotPDF potrafi odzyskać rzeczywisty graf obiektów i drzewo stron, gdy plik PDF ma brakującą, nieprawidłową lub nieaktualną deklarację startxref albo nieużywalne wiersze xref
Recovery sequence
- Normalny zgodny ze specyfikacją program wczytujący jest uruchamiany jako pierwszy w domyślnym trybie
xrrmOnFailure - Odzyskiwanie skanuje źródło w fragmentach po 1 MiB z krótkim przeniesieniem między fragmentami i rejestruje zwalidowane obiekty pośrednie oraz kotwice xref
- Znaczniki zagnieżdżone wewnątrz zwalidowanego obiektu pośredniego są odrzucane, w tym ciągi, komentarze, słowniki i dane binarne strumienia zawierające tekst taki jak
99 0 objlubxref - Prawidłowe tabele lub strumienie xref są próbowane od najnowszego do najstarszego przez istniejący program wczytujący przyrostowy, hybrydowy i strumieni obiektów
- Co najwyżej 4096 kotwic sekcji xref jest zatrzymywanych, co zapobiega mnożeniu prób analizy przez wrogie powtórzenia znaczników
- Jeśli żadna sekcja xref nie utworzy rzeczywistego drzewa stron, przesunięcia obiektów bezpośrednich są przebudowywane, a zduplikowane numery obiektów używają najnowszej fizycznej definicji
- Odzyskiwanie kończy się powodzeniem tylko wtedy, gdy rozstrzygają się rzeczywisty Katalog, drzewo Pages i co najmniej jeden liść strony
Deklaracje
type
THPDFXRefRecoveryMode = (
xrrmDisabled,
xrrmOnFailure,
xrrmForce
);
THPDFXRefRecoveryStatus = (
xrrsNotNeeded,
xrrsSucceeded,
xrrsDisabled,
xrrsScanLimitExceeded,
xrrsObjectLimitExceeded,
xrrsXRefLimitExceeded,
xrrsFailed
);
THPDFXRefRecoveryMethod = (
xrrmethodNone,
xrrmethodRelocatedSection,
xrrmethodRebuiltObjectOffsets
);
THPDFXRefMergeInfo = record
HybridRevisionCount: Integer;
HybridOverlapCount: Integer;
OlderRevisionShadowedEntryCount: Integer;
DuplicateEntryCount: Integer;
NewestRevisionPrecedenceApplied: boolean;
HybridStreamPrecedenceApplied: boolean;
end;
property XRefRecoveryMode: THPDFXRefRecoveryMode;
property XRefRecoveryMaxScanBytes: Int64;
property XRefRecoveryMaxObjects: Integer;
function GetLoadedXRefRecoveryInfo(
out Info: THPDFXRefRecoveryInfo
): boolean;
function GetLoadedXRefMergeInfo(
out Info: THPDFXRefMergeInfo
): boolean;
Konfiguracja
| Członek | Domyślnie | Przeznaczenie |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Wyłącza odzyskiwanie, uruchamia je tylko po awarii normalnego parsowania albo wymusza przed normalnym parsowaniem |
XRefRecoveryMaxScanBytes | 8 GiB | Twardy maksymalny rozmiar źródła akceptowany przez skan odzyskiwania w chunkach |
XRefRecoveryMaxObjects | 2 000 000 | Twardy maksimum zwalidowanych kandydatów na obiekty pośrednie akceptowanych przez odzyskiwanie |
ParserRecoveryEventLimit | 1 024 | Maksimum ustrukturyzowanych zdarzeń przechowywanych dla jednego wczytania; zero wyłącza retencję zdarzeń |
Recovery information
GetLoadedXRefRecoveryInfo zwraca True, gdy próbowano odzyskiwania, i kopiuje najnowszy rekord THPDFXRefRecoveryInfo
Statusrozróżnia powodzenie, wyłączone odzyskiwanie, niepowodzenie limitu bajtów, niepowodzenie limitu obiektów, niepowodzenie limitu kotwic xref oraz niepowodzenie strukturalneMethodidentyfikuje przeniesioną sekcję xref lub przebudowane przesunięcia obiektów bezpośrednichBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCountiXRefCandidateCountudostępniają ograniczoną pracę i jakość odzyskiwaniaSelectedXRefOffsetidentyfikuje przeniesioną sekcję, gdy ta metoda kończy się powodzeniemDiagnosticzawiera zwięzły angielski opis wyniku
Merge precedence information
GetLoadedXRefMergeInfo zwraca True, gdy wczytywanie strumienia xref lub odwołania hybrydowego napotkało stan scalania warty zgłoszenia
Kindrozróżnia zdarzenia attempt, policy, limit, kandydat na obiekt, kandydat xref, wybrana sekcja, przebudowane offsety, sukces i awariaFirstBytejest włącznie,EndBytewyłącznie, a oba mają-1, gdy zakres źródłowy nie istniejeObjectNumberiGenerationNumberidentyfikują kandydatów na obiekty pośrednie i używają-1dla zdarzeń poziomu dokumentu albo kotwicy xrefConfidencestopniuje odprcNoneprzez wyniki niski, średni, wysoki po zweryfikowanyLoadedParserRecoveryEventDroppedCountraportuje zdarzenia pominięte po osiągnięciu skonfigurowanego limitu retencji, utrzymując ograniczoną pamięć na wrogich wejściach
Informacje o precepcji scalania
GetLoadedXRefMergeInfo zwraca True, gdy wczytywanie xref-stream albo hybrydowe napotkało stan scalania wartego raportowania
HybridRevisionCountzlicza tradycyjne rewizje, które wniosły poboczny strumień xref przez/XRefStmHybridOverlapCountzlicza wpisy tabeli już dostarczone przez strumień xref tej samej rewizji, który ma pierwszeństwoOlderRevisionShadowedEntryCountzlicza wpisy zignorowane, ponieważ nowsza rewizja już zdefiniowała ten numer obiektuDuplicateEntryCountzlicza powtórzone wpisy wewnątrz najnowszej sekcji niehybrydowej- Dwie flagi pierwszeństwa stwierdzają, czy odpowiednia reguła została zastosowana, a nie tylko była dostępna
Informacje o integralności
GetLoadedXRefIntegrityInfo raportuje aktywny łańcuch listy wolnej, nieprawidłowe łącza, cykle, niepodpięte wpisy wolne, błędy przejść generacji, zduplikowane definicje żywych obiektów oraz starsze wpisy przysłonięte przez najnowszą rewizję
Szczegóły przysłonięcia obejmują aktywne i odrzucone typy wpisów, offsety albo pola magazynu, generacje i głębokość rewizji, ze sztywnym sufitem 256 wpisów szczegółów
Saving recovered documents
Odzyskany dokument zawsze używa ścieżki pełnego przepisania w SaveLoadedDocument, nawet gdy żaden obiekt nie był edytowany, więc HotPDF nigdy nie kopiuje uszkodzonych bajtów źródłowych jako rzekomo naprawionego wyjścia
Przykład
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;