مرجع HotPDF

يستطيع HotPDF استرداد رسم بياني حقيقي للكائنات وشجرة صفحات عندما يحتوي PDF على إعلان startxref مفقود أو غير صالح أو قديم، أو صفوف xref غير قابلة للاستخدام

تسلسل الاسترداد

  1. يُشغَّل أولًا المُحمِّل العادي المتوافق مع المواصفة في الوضع الافتراضي xrrmOnFailure
  2. يفحص الاسترداد المصدر في أجزاء بحجم 1 ميبيبايت مع ترحيل قصير بين الأجزاء، ويسجل الكائنات غير المباشرة المُتحقَّق منها ومراسي xref
  3. تُرفَض العلامات المتداخلة داخل كائن غير مباشر مُتحقَّق منه، بما في ذلك السلاسل النصية، والتعليقات، والقواميس، وبيانات stream الثنائية التي تحتوي على نص مثل 99 0 obj أو xref
  4. تُجرَّب جداول أو تدفقات xref الصالحة من الأحدث إلى الأقدم عبر أداة التحميل الحالية التزايدية والهجينة وتدفق الكائنات
  5. تُجرَّب جداول أو تدفقات xref الصالحة من الأحدث إلى الأقدم عبر أداة التحميل الحالية التزايدية والهجينة وتدفق الكائنات
  6. تُجرَّب جداول أو تدفقات xref الصالحة من الأحدث إلى الأقدم عبر أداة التحميل الحالية التزايدية والهجينة وتدفق الكائنات
  7. تُجرَّب جداول أو تدفقات xref الصالحة من الأحدث إلى الأقدم عبر أداة التحميل الحالية التزايدية والهجينة وتدفق الكائنات

الإعلانات (Declarations)

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;

الإعلانات (Declarations)

المرجعالمرجعالمرجع
XRefRecoveryModexrrmOnFailureالمرجع
XRefRecoveryMaxScanBytesالمرجعالمرجع
XRefRecoveryMaxObjectsالمرجعالمرجع
ParserRecoveryEventLimitالمرجعالمرجع

الإعلانات (Declarations)

تُعيد GetLoadedXRefRecoveryInfo القيمة True عند محاولة الاسترداد، وتنسخ أحدث سجل THPDFXRefRecoveryInfo

الإعلانات (Declarations)

تُعيد GetLoadedParserRecoveryEvents لقطة مملوكة للمستدعي من تدفق الأحداث المحتفَظ به، بينما تقرأ GetLoadedParserRecoveryEvent إدخالًا واحدًا دون تخصيص نسخة من المصفوفة

الإعلانات (Declarations)

تُعيد GetLoadedXRefMergeInfo القيمة True عندما يواجه تحميل xref-stream أو المرجع الهجين حالة دمج تستحق الإبلاغ

الإعلانات (Declarations)

تُبلغ GetLoadedXRefIntegrityInfo عن سلسلة القائمة الحرة النشطة، والروابط غير الصالحة، والحلقات، والإدخالات الحرة غير المرتبطة، وأخطاء انتقال الجيل، والتعريفات الحية المكررة، والإدخالات القديمة المُظلَّلة بواسطة أحدث مراجعة

تتضمن تفاصيل التظليل أنواع الإدخالات النشطة والمرفوضة، وحقول الإزاحة أو التخزين، والأجيال، وعمق المراجعة، بحد أقصى ثابت من 256 إدخالًا تفصيليًا

الإعلانات (Declarations)

يستخدم المستند المُسترَد دائمًا مسار إعادة الكتابة الكاملة في SaveLoadedDocument، حتى عندما لا يُعدَّل أي كائن، بحيث لا ينسخ HotPDF أبدًا بايتات المصدر التالفة كإخراج يبدو مُصلَحًا

الإعلانات (Declarations)

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;

الإعلانات (Declarations)