Pemulihan Referensi-Silang Berbatas
HotPDF dapat memulihkan grafik objek nyata dan pohon halaman ketika PDF memiliki deklarasi startxref yang hilang, tidak valid, atau basi atau baris xref yang tidak dapat digunakan
Urutan pemulihan
- Pemuat yang patut-spec normal berjalan lebih dulu dalam mode
xrrmOnFailuredefault - Pemulihan memindai sumber dalam potongan 1 MiB dengan carry pendek antar potongan dan mencatat objek tidak-langsung tervalidasi dan anchor xref
- Penanda bersarang di dalam objek tidak-langsung tervalidasi ditolak, termasuk string, komentar, kamus, dan data stream biner yang berisi teks seperti
99 0 objatauxref - Tabel atau stream xref valid dicoba dari terbaru ke terlama melalui pemuat inkremental, hibrida, dan stream-objek yang ada
- Paling banyak 4,096 anchor bagian xref dipertahankan, mencegah pengulangan penanda adversarial menggandakan upaya penguraian
- Jika tidak ada bagian xref yang menghasilkan pohon halaman nyata, offset objek-langsung dibangun ulang dan nomor objek duplikat menggunakan definisi fisik terbaru
- Pemulihan berhasil hanya ketika Katalog, pohon Pages, dan setidaknya satu daun halaman nyata terselesaikan
Deklarasi
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;
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;
end;
property XRefRecoveryMode: THPDFXRefRecoveryMode;
property XRefRecoveryMaxScanBytes: Int64;
property XRefRecoveryMaxObjects: Integer;
function GetLoadedParserRecoveryEvents:
THPDFParserRecoveryEventArray;
function GetLoadedParserRecoveryEvent(
function GetLoadedXRefRecoveryInfo(
out Info: THPDFXRefRecoveryInfo
): boolean;
function GetLoadedXRefMergeInfo(
out Info: THPDFXRefMergeInfo
): boolean;
function GetLoadedXRefIntegrityInfo(
out Info: THPDFXRefIntegrityInfo
): boolean;
Konfigurasi
| Anggota | Default | Tujuan |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Menonaktifkan pemulihan, menjalankannya hanya setelah penguraian normal gagal, atau memaksanya sebelum penguraian normal |
XRefRecoveryMaxScanBytes | 8 GiB | Ukuran sumber maksimum keras yang diterima oleh pemindaian pemulihan terpenggal |
XRefRecoveryMaxObjects | 2,000,000 | Kandidat objek-tidak-langsung tervalidasi maksimum keras yang diterima oleh pemulihan |
ParserRecoveryEventLimit | 1.024 | Jumlah maksimum event terstruktur yang disimpan untuk satu pemuatan, nol menonaktifkan penyimpanan event |
Informasi pemulihan
GetLoadedXRefRecoveryInfo mengembalikan True ketika pemulihan dicoba dan menyalin record THPDFXRefRecoveryInfo terbaru
Statusmembedakan keberhasilan, pemulihan yang dinonaktifkan, kegagalan batas-byte, kegagalan batas-objek, kegagalan batas-anchor-xref, dan kegagalan strukturalMethodmengidentifikasi bagian xref yang direlokasi atau offset objek-langsung yang dibangun-ulangBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCount, danXRefCandidateCountmengekspos pekerjaan berbatas dan kualitas pemulihanSelectedXRefOffsetmengidentifikasi bagian yang direlokasi ketika metode itu berhasilDiagnosticberisi deskripsi hasil bahasa Inggris yang ringkas
Informasi prioritas penggabungan
GetLoadedXRefMergeInfo mengembalikan True ketika pemuatan stream-xref atau referensi-hibrida menemui status penggabungan yang patut dilaporkan
Kindmembedakan event percobaan, policy, batas, kandidat objek, kandidat xref, section terpilih, offset hasil rebuild, keberhasilan, dan kegagalanFirstByteinklusif danEndByteeksklusif, keduanya bernilai-1ketika tidak ada rentang sumberObjectNumberdanGenerationNumbermengidentifikasi kandidat objek tidak langsung dan memakai-1untuk event level-dokumen maupun anchor-xrefHybridRevisionCountmenghitung revisi tradisional yang menyumbangkan stream xref sampingan melalui/XRefStmHybridOverlapCountmenghitung entri tabel yang sudah disediakan oleh stream xref revisi yang sama, yang memiliki prioritas
Informasi prioritas penggabungan
GetLoadedXRefMergeInfo mengembalikan True ketika pemuatan xref-stream atau hybrid-reference menemui state penggabungan yang layak dilaporkan
HybridRevisionCountmenghitung revisi tradisional yang menyumbang xref stream samping lewat/XRefStmHybridOverlapCountmenghitung entri tabel yang sudah disuplai xref stream revisi yang sama, yang menjadi prioritasOlderRevisionShadowedEntryCountmenghitung entri yang diabaikan karena revisi yang lebih baru sudah mendefinisikan nomor objek ituDuplicateEntryCountmenghitung entri berulang di dalam section non-hybrid terbaru- Kedua flag prioritas menyatakan apakah aturan terkait benar-benar dipakai, bukan sekadar tersedia
Menyimpan dokumen yang dipulihkan
Dokumen yang dipulihkan selalu menggunakan path penulisan-ulang penuh di SaveLoadedDocument, bahkan ketika tidak ada objek yang diedit, sehingga HotPDF tidak pernah menyalin byte sumber yang rusak sebagai keluaran yang tampaknya diperbaiki
Detail yang ter-bayangi mencakup jenis entri aktif dan yang ditolak, offset atau field penyimpanan, generation, dan kedalaman revisi, dengan plafon detail tetap 256 entri
Informasi integritas
Dokumen hasil pemulihan selalu memakai jalur tulis-ulang-penuh di SaveLoadedDocument, bahkan ketika tidak ada objek yang diedit, sehingga HotPDF tidak pernah menyalin byte sumber rusak sebagai output yang tampak sudah diperbaiki
Contoh
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;