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
- Normal belirtimle uyumlu yükleyici önce varsayılan
xrrmOnFailuremodunda çalışır - 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
- Doğrulanan bir dolaylı nesnenin içindeki iç içe işaretleyiciler reddedilir; bu,
99 0 objveyaxrefgibi metin içeren dizeleri, açıklamaları, sözlükleri ve ikili akış verilerini kapsar - 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
- 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
- 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
- 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
| Üye | Varsayılan | Amaç |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Kurtarmayı 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 |
XRefRecoveryMaxScanBytes | 8 GiB | Parçalı kurtarma taramasının kabul ettiği katı en yüksek kaynak boyutu |
XRefRecoveryMaxObjects | 2.000.000 | Kurtarmanın kabul ettiği, doğrulanmış dolaylı nesne adaylarının katı en yüksek sayısı |
ParserRecoveryEventLimit | 1.024 | Tek 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
Status, başarıyı, devre dışı kurtarmayı, bayt sınırı başarısızlığını, nesne sınırı başarısızlığını, xref bağlantı sınırı başarısızlığını ve yapısal başarısızlığı ayırt ederMethod, yeniden konumlandırılan bir xref bölümünü veya yeniden inşa edilen doğrudan nesne ofsetlerini tanımlarBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCountveXRefCandidateCount, sınırlı çalışmayı ve kurtarma kalitesini ortaya koyarSelectedXRefOffset, o yöntem başarılı olduğunda yeniden konumlandırılan bölümü tanımlarDiagnostic, kısa bir İngilizce sonuç açıklaması içerir
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
Kind; deneme, ilke, sınır, nesne adayı, xref adayı, seçilen bölüm, yeniden kurulan ofsetler, başarı ve başarısızlık olaylarını ayırt ederFirstBytedahil,EndBytehariçtir; kaynak aralık yokken ikisi de-1yapılırObjectNumberveGenerationNumberdolaylı nesne adaylarını tanımlar; belge düzeyi veya xref çapası olayları için-1kullanırConfidence;prcNone'dan düşük, orta, yüksek ve doğrulanmış sonuçlarına doğru ilerlerLoadedParserRecoveryEventDroppedCount, yapılandırılan saklama sınırından sonra atlanan olayları bildirir; düşmanca girdilerde sınırlı belleği korur
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
HybridRevisionCount,/XRefStmaracılığıyla yan xref akışı katkıda bulunan geleneksel düzeltmeleri sayarHybridOverlapCount, aynı düzeltmenin xref akışı tarafından zaten sağlanan ve öncelik taşıyan tablo girişlerini sayarOlderRevisionShadowedEntryCount, daha yeni bir düzeltme zaten o nesne numarasını tanımladığı için yok sayılan girişleri sayarDuplicateEntryCount, en yeni hibrit olmayan bölümün içindeki yinelenen girişleri sayar- İki öncelik bayrağı, ilgili kuralın yalnızca kullanılabilir olmaktan ziyade uygulanıp uygulanmadığını belirtir
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;