למה קבצי PDF נפגמים או משתבשים?
תשובה קצרה: PDF נכשל בפתיחה כשטבלת ההיסטים XREF, קטלוג האובייקטים או סמן %%EOF נקטעים או זזים בהורדה שנקטעה, סנכרון ענן חלקי, קובץ מצורף תקול או ניתוק אחסון — גם כש-99% מזרמי העמודים שלמים.
מסמכי PDF נשענים על מבנה אינדקס בינארי קשיח לפי ISO 32000-1. בסוף כל PDF תקין יושבות טבלת Cross-Reference (xref) ומילון trailer שממפים היסטי בתים לכל אובייקט עקיף (obj ... endobj), גופן, זרם וקטורי ותמונה בקובץ.
- העברות שנקטעו ו-trailer חתוך: אם הורדה או קובץ מצורף חותכים את הקילו-בייטים האחרונים, מצביע
startxref וסמן %%EOF אובדים, ו-Adobe Acrobat וצופי דפדפן דוחים את כל המסמך. - סחיפת היסט בתים: סקריפטים ישנים או שערי דוא״ל שמשנים סופי שורה (
LF ל-CRLF) מזיזים כל היסט ומבטלים את אינדקס ה-XREF. - זרמי אובייקטים פגומים: זרם FlateDecode פגום אחד או רשומת מילון שבורה יכולים לעצור מנתח PDF קפדני לפני שהוא מרנדר עמודים תקינים.
איך עובד מנוע השחזור הדו-שלבי
תשובה קצרה: Utiliome מריצה צינור שחזור דו-שלבי ב-WebAssembly בתוך ה-RAM של הדפדפן: שלב 1 עם qpdf-wasm סורק בתים ובונה מחדש טבלאות XREF ואורכי זרמים, ושלב 2 עם pdfjs-dist ו-pdf-lib מחלץ כל עמוד שלם.
בניגוד לכלי תיקון בענן שדורשים להעלות קבצים חסויים לשרתים של צד שלישי, Utiliome מריצה ארכיטקטורת שחזור פורנזית דו-שלבית במלואה בארגז החול של WebAssembly בדפדפן:
- שלב 1 — שחזור מבני של XREF וזרמים (
qpdf-wasm): המנוע סורק את המאגר הבינארי מבית אפס, מאתר כל כותרת N 0 obj, בונה טבלת Cross-Reference חדשה, מחשב מחדש מפתחות /Length בזרמים דחוסים וכותב trailer תואם תקן. - שלב 2 — חילוץ עמודים סובלני לשגיאות (
pdfjs-dist + pdf-lib): אם קיטוע קשה הרס את קטלוג המסמך, שלב 2 טוען את המאגר עם stopAtErrors: false, מבודד כל צומת עץ עמודים קריא, ומשתיל את העמודים ששרדו למיכל PDF חדש.
אבחון שגיאות PDF ותוצאות השחזור
תשובה קצרה: שגיאות כמו «הקובץ פגום ולא ניתן לתיקון» או «טעינת מסמך ה-PDF נכשלה» כמעט תמיד מצביעות על אינדקס XREF שבור או trailer חסר. מנועי שלב 1 ו-2 של Utiliome משחזרים אותם בלי אובדן נתונים.
צופי PDF שונים מדווחים על שחיתות מבנית בהודעות אבחון שונות. הבנת כל שגיאה עוזרת לחזות את סיכוי השחזור:
- «הקובץ פגום ולא ניתן לתיקון» (Adobe Acrobat): נגרם בדרך כלל מהיסטי בתים זזים בטבלת
xref או מהפניית קטלוג /Root פגומה. שלב 1 בונה את האינדקס מחדש בנאמנות וקטורית מלאה. - «שגיאת פורמט: לא PDF או פגום» (Preview / צופים במובייל): לעיתים נגרם מבייטים זבל לפני כותרת
%PDF-1.x או מ-trailer %%EOF חסר. המנתח מסיר הקדמות לא תקינות ומיישר את הכותרת אוטומטית. - עמודים ריקים או חסרים באמצע המסמך: מצביע על שחיתות מקומית בזרם FlateDecode בעמודים מסוימים; שלב 2 מבודד את האובייקט הפגום ומחלץ את כל העמודים סביבו.
אחרי השחזור: בדיקה, שיטוח ואבטחה
תשובה קצרה: אחרי תיקון PDF פגום, בדקו מספר עמודים ושלמות חזותית, ואז שטחו הערות או נקו מטא-דאטה של XMP בחבילת ה-PDF המקומית של Utiliome, כדי שהמסמך יהיה יציב לארכיון ולשיתוף.
אחרי שה-PDF שוחזר והורד, מומלץ מעבר אימות קצר לפני הפצה או ארכוב:
- בדקו סדר עמודים ושלמות: אם הורדה קטועה איבדה עמודים בסוף, השתמשו ב-סידור PDF או ב-מיזוג PDF כדי לצרף עמודי החלפה מקומית.
- נעלו רכיבים אינטראקטיביים: אם השחיתות נבעה מווידג׳טים פגומים של AcroForm או ממראה חתימה של צד שלישי, העבירו את הקובץ ב-שיטוח PDF כדי לאפות הערות לתוכן העמוד.
- בדקו מטא-דאטה פנימי: בדקו או נקו מאפייני מסמך ב-מציג מטא-דאטה של PDF או ב-מסיר מטא-דאטה של PDF.