Bounded Cross-Reference Recovery

‏HotPDF وقتی PDF اعلان startxref غایب، نامعتبر یا کهنه دارد یا ردیف‌های xref غیرقابل استفاده‌اند، می‌تواند گراف شیء و درخت صفحهٔ واقعی را بازیابی کند

توالی بازیابی

  1. بارگذار سازگار با مشخصه در حالت پیش‌فرض xrrmOnFailure ابتدا اجرا می‌شود
  2. بازیابی مبدأ را در قطعه‌های 1 MiB با حامل کوتاه بین قطعه‌ها پویش می‌کند و اشیاء غیرمستقیم و لنگرگاه‌های xref اعتبارسنجی‌شده را ثبت می‌کند
  3. نشانگرهای تودرتو درون شیء غیرمستقیم معتبر رد می‌شوند، از جمله رشته‌ها، توضیح‌ها، دیکشنری‌ها و دادهٔ باینری جریان شامل متنی مثل 99 0 obj یا xref
  4. جدول‌ها یا جریان‌های xref معتبر از جدیدترین به قدیمی‌ترین از طریق بارگذار موجود افزایشی، ترکیبی و object-stream آزموده می‌شوند
  5. حداکثر 4,096 لنگرگاه بخش xref نگه داشته می‌شود تا تکرار خصمانهٔ نشانگرها نتواند تلاش‌های تجزیه را چند برابر کند
  6. اگر هیچ بخش xref درخت صفحهٔ واقعی تولید نکند، آفست‌های اشیاء مستقیم بازسازی می‌شوند و شماره‌های شیء تکراری از جدیدترین تعریف فیزیکی استفاده می‌کنند
  7. بازیابی فقط وقتی موفق می‌شود که کاتالوگ واقعی، درخت Pages و دست‌کم یک برگ صفحه حل شود

اعلان‌ها

type
  THPDFXRefRecoveryMode = (
    xrrmDisabled,
    xrrmOnFailure,
    xrrmForce
  );

  THPDFXRefRecoveryStatus = (
    xrrsNotNeeded,
    xrrsSucceeded,
    xrrsDisabled,
    xrrsScanLimitExceeded,
    xrrsObjectLimitExceeded,
    xrrsXRefLimitExceeded,
    xrrsFailed
  );

  THPDFXRefRecoveryMethod = (
    xrrmethodNone,
    xrrmethodRelocatedSection,
    xrrmethodRebuiltObjectOffsets
  );

  THPDFParserRecoveryConfidence = (
    prcNone,
    prcLow,
    prcMedium,
    prcHigh,
    prcVerified
  );

  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;
property LoadedParserRecoveryEventDroppedCount: Integer;

function GetLoadedXRefRecoveryInfo(
  out Info: THPDFXRefRecoveryInfo
): boolean;

function GetLoadedParserRecoveryEvents:
  THPDFParserRecoveryEventArray;

function GetLoadedParserRecoveryEvent(
  Index: Integer;
  out EventInfo: THPDFParserRecoveryEvent
): boolean;

function GetLoadedXRefMergeInfo(
  out Info: THPDFXRefMergeInfo
): boolean;

function GetLoadedXRefIntegrityInfo(
  out Info: THPDFXRefIntegrityInfo
): boolean;

پیکربندی

عضوپیش‌فرضهدف
XRefRecoveryModexrrmOnFailureبازیابی را غیرفعال می‌کند، فقط پس از شکست تجزیه عادی اجرایش می‌کند یا پیش از تجزیه عادی آن را اجباری می‌کند
XRefRecoveryMaxScanBytes‏8 GiBبیشینهٔ سخت اندازهٔ مبدأ پذیرفته‌شده توسط پویش بازیابی قطعه‌ای
XRefRecoveryMaxObjects2,000,000بیشینهٔ سخت نامزدهای شیء غیرمستقیمِ اعتبارسنجی‌شدهٔ پذیرفته‌شده توسط بازیابی
ParserRecoveryEventLimit1,024بیشینهٔ رخدادهای ساختاری نگه‌داشته‌شده برای یک بار بارگذاری؛ مقدار صفر نگه‌داری رخدادها را غیرفعال می‌کند

اطلاعات بازیابی

GetLoadedXRefRecoveryInfo True وقتی بازیابی تلاش شده باشد THPDFXRefRecoveryInfo برمی‌گرداند و جدیدترین رکورد را کپی می‌کند

رخدادهای بازیابی ساختاریافته

GetLoadedParserRecoveryEvents GetLoadedParserRecoveryEvent تصویر لحظه‌ای در مالکیت فراخواننده از جریان رخداد نگه‌داشته‌شده برمی‌گرداند، در حالی که بدون تخصیص کپی آرایه یک مدخل را می‌خواند

اطلاعات اولویت ادغام

GetLoadedXRefMergeInfo True وقتی بارگذاری xref-stream یا مرجع ترکیبی وضعیت ادغامِ ارزش گزارشی داشته باشد برمی‌گرداند

اطلاعات یکپارچگی

GetLoadedXRefIntegrityInfo زنجیرهٔ فعال فهرست آزاد، پیوندهای نامعتبر، چرخه‌ها، مدخل‌های آزاد بدون پیوند، خطاهای گذار generation، تعاریف زندهٔ تکراری و مدخل‌های قدیمی‌تر سایه‌شده توسط جدیدترین بازبینی را گزارش می‌کند

جزئیات سایه‌شده شامل نوع مدخل فعال و رد‌شده، آفست یا فیلد ذخیره‌سازی، generationها و عمق بازبینی است، با سقف ثابت 256 مدخل جزئیات

ذخیرهٔ اسناد بازیابی‌شده

سند بازیابی‌شده همیشه در SaveLoadedDocument از مسیر بازنویسی کامل استفاده می‌کند، حتی وقتی هیچ شیء ویرایش نشده، تا HotPDF هرگز بایت‌های مبدأ آسیب‌دیده را به‌عنوان خروجی ظاهراً تعمیرشده کپی نکند

نمونه

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های مرتبط