Bounded Cross-Reference Recovery
HotPDF وقتی PDF اعلان startxref غایب، نامعتبر یا کهنه دارد یا ردیفهای xref غیرقابل استفادهاند، میتواند گراف شیء و درخت صفحهٔ واقعی را بازیابی کند
توالی بازیابی
- بارگذار سازگار با مشخصه در حالت پیشفرض
xrrmOnFailureابتدا اجرا میشود - بازیابی مبدأ را در قطعههای 1 MiB با حامل کوتاه بین قطعهها پویش میکند و اشیاء غیرمستقیم و لنگرگاههای xref اعتبارسنجیشده را ثبت میکند
- نشانگرهای تودرتو درون شیء غیرمستقیم معتبر رد میشوند، از جمله رشتهها، توضیحها، دیکشنریها و دادهٔ باینری جریان شامل متنی مثل
99 0 objیاxref - جدولها یا جریانهای xref معتبر از جدیدترین به قدیمیترین از طریق بارگذار موجود افزایشی، ترکیبی و object-stream آزموده میشوند
- حداکثر 4,096 لنگرگاه بخش xref نگه داشته میشود تا تکرار خصمانهٔ نشانگرها نتواند تلاشهای تجزیه را چند برابر کند
- اگر هیچ بخش xref درخت صفحهٔ واقعی تولید نکند، آفستهای اشیاء مستقیم بازسازی میشوند و شمارههای شیء تکراری از جدیدترین تعریف فیزیکی استفاده میکنند
- بازیابی فقط وقتی موفق میشود که کاتالوگ واقعی، درخت 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;
پیکربندی
| عضو | پیشفرض | هدف |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | بازیابی را غیرفعال میکند، فقط پس از شکست تجزیه عادی اجرایش میکند یا پیش از تجزیه عادی آن را اجباری میکند |
XRefRecoveryMaxScanBytes | 8 GiB | بیشینهٔ سخت اندازهٔ مبدأ پذیرفتهشده توسط پویش بازیابی قطعهای |
XRefRecoveryMaxObjects | 2,000,000 | بیشینهٔ سخت نامزدهای شیء غیرمستقیمِ اعتبارسنجیشدهٔ پذیرفتهشده توسط بازیابی |
ParserRecoveryEventLimit | 1,024 | بیشینهٔ رخدادهای ساختاری نگهداشتهشده برای یک بار بارگذاری؛ مقدار صفر نگهداری رخدادها را غیرفعال میکند |
اطلاعات بازیابی
GetLoadedXRefRecoveryInfo True وقتی بازیابی تلاش شده باشد THPDFXRefRecoveryInfo برمیگرداند و جدیدترین رکورد را کپی میکند
Statusموفقیت، بازیابی غیرفعال، شکست حد بایت، شکست حد شیء، شکست حد لنگرگاه xref و شکست ساختاری را تفکیک میکندMethodبخش xref جابهجاشده یا آفستهای بازسازیشدهٔ اشیاء مستقیم را شناسایی میکندBytesScannedCandidateObjectCount،RecoveredObjectCount،DuplicateObjectCount،RejectedCandidateCount،XRefCandidateCountو کار محدودشده و کیفیت بازیابی را در معرض دید میگذارندSelectedXRefOffsetوقتی آن متد موفق شود بخش جابهجاشده را شناسایی میکندDiagnosticتوضیح مختصر نتیجه به انگلیسی دارد
رخدادهای بازیابی ساختاریافته
GetLoadedParserRecoveryEvents GetLoadedParserRecoveryEvent تصویر لحظهای در مالکیت فراخواننده از جریان رخداد نگهداشتهشده برمیگرداند، در حالی که بدون تخصیص کپی آرایه یک مدخل را میخواند
Kindرخدادهای تلاش، سیاست، حد، نامزد شیء، نامزد xref، بخش انتخابی، آفستهای بازسازیشده، موفقیت و شکست را تفکیک میکندFirstByteEndByteشاملکننده است و-1غیرشامل، و وقتی بازهٔ مبدأ وجود ندارد هر دو هستندObjectNumberGenerationNumberو-1نامزدهای شیء غیرمستقیم را شناسایی میکنند و برای رخدادهای سطح سند یا لنگرگاه xref از استفاده میکنندConfidenceprcNoneاز به نتایج کم، متوسط، بالا و تأییدشده پیش میرودLoadedParserRecoveryEventDroppedCountرخدادهای حذفشده پس از حد نگهداری پیکربندیشده را گزارش میکند و حافظه را روی ورودیهای خصمانه محدود نگه میدارد
اطلاعات اولویت ادغام
GetLoadedXRefMergeInfo True وقتی بارگذاری xref-stream یا مرجع ترکیبی وضعیت ادغامِ ارزش گزارشی داشته باشد برمیگرداند
HybridRevisionCountبازبینی\u200cهای سنتی که از طریق/XRefStmیک جریان xref جانبی داده\u200cاند را می\u200cشماردHybridOverlapCountمدخلهای جدولی که قبلاً توسط جریان xref همان بازبینی تأمین شدهاند و اولویت دارند را میشماردOlderRevisionShadowedEntryCountمدخلهایی را که چون بازبینی جدیدتری آن شماره شیء را تعریف کرده نادیده گرفته شدهاند میشماردDuplicateEntryCountمدخلهای تکراری درون جدیدترین بخش غیرترکیبی را میشمارد- دو پرچم اولویت بیان میکنند آیا قاعدهٔ مربوطه اعمال شده است یا فقط در دسترس بوده
اطلاعات یکپارچگی
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;