Sınırlı Çapraz Başvuru Kurtarması

Bir PDF'de eksik, geçersiz veya eski bir startxref bildirimi veya kullanılamaz xref satırı olduğunda HotPDF gerçek bir nesne grafiğini ve sayfa ağacını kurtarabilir

Kurtarma dizisi

  1. Normal belirtimle uyumlu yükleyici önce varsayılan xrrmOnFailure modunda çalışır
  2. Kurtarma, kaynağı 1 MiB öbekler halinde öbekler arasında kısa bir taşımayla tarar ve doğrulanan dolaylı nesneleri ve xref bağlantılarını kaydeder
  3. Doğrulanan bir dolaylı nesnenin içindeki iç içe işaretleyiciler reddedilir; bu, 99 0 obj veya xref gibi metin içeren dizeleri, açıklamaları, sözlükleri ve ikili akış verilerini kapsar
  4. Geçerli xref tabloları veya akışları, en yeniden en eskiye doğru var olan artımlı, hibrit ve nesne akışı yükleyicisi üzerinden denenir
  5. En fazla 4.096 xref bölüm bağlantısı tutulur; böylece düşmanca işaretleyici yinelemesinin ayrıştırma denemelerini çoğaltması önlenir
  6. Hiçbir xref bölümü gerçek bir sayfa ağacı üretmezse, doğrudan nesne ofsetleri yeniden inşa edilir ve yinelenen nesne numaraları en son fiziksel tanımı kullanır
  7. Kurtarma yalnızca gerçek bir Catalog, Pages ağacı ve en az bir sayfa yaprağı çözümlendiğinde başarılı olur

Bildirimler

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;

function GetLoadedXRefIntegrityInfo(
  out Info: THPDFXRefIntegrityInfo
): boolean;

Yapılandırma

ÜyeVarsayılanAmaç
XRefRecoveryModexrrmOnFailureKurtarmayı devre dışı bırakır, yalnızca normal ayrıştırma başarısız olunca çalıştırır veya normal ayrıştırmadan önce zorlar
XRefRecoveryMaxScanBytes8 GiBParçalı kurtarma taramasının kabul ettiği katı en yüksek kaynak boyutu
XRefRecoveryMaxObjects2.000.000Kurtarmanın kabul ettiği, doğrulanmış dolaylı nesne adaylarının katı en yüksek sayısı
ParserRecoveryEventLimit1.024Tek bir yükleme için saklanan yapılandırılmış olayların en yüksek sayısı; sıfır, olay saklamayı devre dışı bırakır

Kurtarma bilgisi

GetLoadedXRefRecoveryInfo, kurtarma denendiğinde True döndürür ve en son THPDFXRefRecoveryInfo kaydını kopyalar

Yapılandırılmış kurtarma olayları

GetLoadedParserRecoveryEvents, saklanan olay akışının çağıranın sahiplendiği bir anlık görüntüsünü döndürür; GetLoadedParserRecoveryEvent ise dizi kopyası ayırmadan tek bir girdi okur

Birleştirme önceliği bilgisi

GetLoadedXRefMergeInfo, xref akışı veya hibrit başvuru yüklemesi raporlanmaya değer bir birleştirme durumuyla karşılaştığında True döndürür

Bütünlük bilgisi

GetLoadedXRefIntegrityInfo, etkin serbest liste zincirini, geçersiz bağlantıları, döngüleri, bağlantısız serbest girişleri, kuşak geçiş hatalarını, yinelenen canlı tanımları ve en yeni düzeltme tarafından gölgelenen eski girişleri raporlar

Gölgelenen ayrıntı, etkin ve reddedilen giriş türlerini, ofsetleri veya depolama alanlarını, kuşakları ve sabit 256 girişlik ayrıntı üst sınırıyla düzeltme derinliğini içerir

Kurtarılan belgeleri kaydetme

Kurtarılan bir belge, hiçbir nesne düzenlenmemiş olsa bile SaveLoadedDocument içinde her zaman tam yeniden yazma yolunu kullanır; böylece HotPDF asla bozuk kaynak baytlarını görünüşe göre onarılmış bir çıktı olarak kopyalamaz

Örnek

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;

İlgili API'ler