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

  1. Pemuat yang patut-spec normal berjalan lebih dulu dalam mode xrrmOnFailure default
  2. Pemulihan memindai sumber dalam potongan 1 MiB dengan carry pendek antar potongan dan mencatat objek tidak-langsung tervalidasi dan anchor xref
  3. Penanda bersarang di dalam objek tidak-langsung tervalidasi ditolak, termasuk string, komentar, kamus, dan data stream biner yang berisi teks seperti 99 0 obj atau xref
  4. Tabel atau stream xref valid dicoba dari terbaru ke terlama melalui pemuat inkremental, hibrida, dan stream-objek yang ada
  5. Paling banyak 4,096 anchor bagian xref dipertahankan, mencegah pengulangan penanda adversarial menggandakan upaya penguraian
  6. Jika tidak ada bagian xref yang menghasilkan pohon halaman nyata, offset objek-langsung dibangun ulang dan nomor objek duplikat menggunakan definisi fisik terbaru
  7. 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

AnggotaDefaultTujuan
XRefRecoveryModexrrmOnFailureMenonaktifkan pemulihan, menjalankannya hanya setelah penguraian normal gagal, atau memaksanya sebelum penguraian normal
XRefRecoveryMaxScanBytes8 GiBUkuran sumber maksimum keras yang diterima oleh pemindaian pemulihan terpenggal
XRefRecoveryMaxObjects2,000,000Kandidat objek-tidak-langsung tervalidasi maksimum keras yang diterima oleh pemulihan
ParserRecoveryEventLimit1.024Jumlah 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

Informasi prioritas penggabungan

GetLoadedXRefMergeInfo mengembalikan True ketika pemuatan stream-xref atau referensi-hibrida menemui status penggabungan yang patut dilaporkan

Informasi prioritas penggabungan

GetLoadedXRefMergeInfo mengembalikan True ketika pemuatan xref-stream atau hybrid-reference menemui state penggabungan yang layak dilaporkan

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;

API terkait