שחזור הפניות-צירוף חסום
HotPDF יכול לשחזר גרף אובייקטים אמיתי ועץ עמודים כאשר ל-PDF יש הצהרת startxref חסרה, בלתי-תקינה או מיושנת, או שורות xref בלתי-שמישות
רצף שחזור
- הטוען הרגיל תואם-המפרט רץ ראשון במצב
xrrmOnFailureברירת המחדל - השחזור סורק את המקור בנתחים של 1 MiB עם carry קצר בין נתחים ורושם אובייקטים עקיפים מאומתים ועוגני xref
- סמנים המקוננים בתוך אובייקט עקיף מאומת נדחים, לרבות מחרוזות, הערות, מילונים ונתוני זרם בינאריים המכילים טקסט כגון
99 0 objאוxref - טבלאות או זרמי xref תקפים מנוסים מהחדש ביותר אל הישן ביותר דרך הטוען האינקרמנטלי, ההיברידי ו-shל object-stream הקיים
- לכל היותר 4,096 עוגני סעיף xref נשמרים, ובכך נמנעת הכפלת ניסיונות פרסור על ידי חזרת סמנים עוינת
- אם אף סעיף xref אינו מייצר עץ עמודים אמיתי, היסטי אובייקט-ישיר נבנים מחדש ומספרי אובייקטים כפולים משתמשים בהגדרה הפיזית החדשה ביותר
- השחזור מצליח רק כאשר Catalog אמיתי, עץ Pages ולפחות עלה עמוד אחד נפתרים
הצהרות
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;
הגדרה
| חבר | ברירת מחדל | מטרה |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | משבית את השחזור, מריץ אותו רק לאחר שהפרסור הרגיל נכשל, או מכריח אותו לפני הפרסור הרגיל |
XRefRecoveryMaxScanBytes | 8 GiB | גודל מקור מרבי קשיח שסריקת השחזור המנותחת מקבלת |
XRefRecoveryMaxObjects | 2,000,000 | מרב מועמדי אובייקט-עקיף מאומתים קשיח שהשחזור מקבל |
ParserRecoveryEventLimit | 1,024 | מקסימום אירועים מובנים שנשמרו עבור טעינה אחת, כאשר אפס מנטרל שימור אירועים |
מידע שחזור
GetLoadedXRefRecoveryInfo מחזיר True כאשר נעשה ניסיון שחזור ומעתיק את רשומת THPDFXRefRecoveryInfo העדכנית ביותר
Statusמבחין בין הצלחה, שחזור מושבת, כשל גבול-בתים, כשל גבול-אובייקטים, כשל גבול-עוגני-xref וכשל מבניMethodמזהה סעיף xref שעבר מיקום-מחדש או היסטי אובייקט-ישיר שנבנו מחדשBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCountו-XRefCandidateCountחושפים עבודה חסומה ואיכות שחזורSelectedXRefOffsetמזהה את הסעיף שעבר מיקום-מחדש כאשר שיטה זו מצליחהDiagnosticמכיל תיאור תוצאה אנגלי תמציתי
אירועי שחזור מובנים
GetLoadedParserRecoveryEvents מחזיר תמונת מצב בבעלות הקורא של זרם האירועים שנשמרו, בעוד GetLoadedParserRecoveryEvent קורא רשומה אחת בלי להקצות עותק מערך
Kindמבחין בין אירועי ניסיון, מדיניות, מגבלה, מועמד-אובייקט, מועמד-xref, מקטע נבחר, offsets שנבנו מחדש, הצלחה וכשלFirstByteהוא כוללני ו-EndByteהוא מוציא, ושניהם נקבעים ל--1כשלא קיים טווח מקורObjectNumberו-GenerationNumberמזהים מועמדי אובייקט עקיף ומשתמשים ב--1עבור אירועים ברמת המסמך או עוגן-xrefConfidenceמתקדם מ-prcNoneדרך תוצאות נמוכה, בינונית, גבוהה ומאומתתLoadedParserRecoveryEventDroppedCountמדווח על אירועים שהושמטו אחרי מגבלת השימור שהוגדרה, תוך שמירה על זיכרון תחום בקלט עוין
מידע קדימות מיזוג
GetLoadedXRefMergeInfo מחזיר True כשטעינת xref-stream או הפניה-היברידית נתקלה במצב מיזוג ששווה לדווח עליו
HybridRevisionCountסופר מהדורות מסורתיות שתרמו זרם xref צדדי דרך/XRefStmHybridOverlapCountסופר רשומות טבלה שכבר סופקו על ידי זרם ה-xref של אותה מהדורה, שגוברOlderRevisionShadowedEntryCountסופר רשומות שהתעלמו מהן כי מהדורה חדשה יותר כבר הגדירה את מספר האובייקט ההואDuplicateEntryCountסופר רשומות חוזרות בתוך הסעיף הלא-היברידי החדש ביותר- שני דגלי הקדימות מצהירים אם הכלל המתאים הופעל בפועל ולא רק היה זמין
מידע שלמות
GetLoadedXRefIntegrityInfo מדווח על שרשרת הרשימה-הפנויה הפעילה, קישורים לא תקינים, מחזורים, רשומות פנויות לא מקושרות, שגיאות מעבר generation, הגדרות חיות כפולות ורשומות ישנות שמוצלות על ידי המהדורה החדשה ביותר
פירוט ההצללה כולל סוגי רשומות פעילים ונדחים, offsets או שדות אחסון, generations ועומק מהדורה, עם תקרת פירוט קבועה של 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;