למה קופסה שחורה היא לא מספיקה
רוב כלי ה-PDF מאפשרים למשתמשים לבצע "redaction" (הסתרת מידע) על ידי ציור מלבן שחור מעל טקסט רגיש. המלבן מסתיר את המילים על המסך, אך התווים שבבסיס נשארים בזרם התוכן (content stream) של הקובץ. כל אחד יכול לבחור את הטקסט המוסתר, להעתיק אותו, או להריץ סקריפט פשוט כדי לחלץ אותו. במילים אחרות, הנתונים עדיין שם; הקופסה השחורה היא רק כיסוי ויזואלי.
הבעיה שעמדה בפני המפתח
המחבר נזקק לעורך PDF שרץ כולו בדפדפן, ללא העלאת קבצים לשרת. מגבלה זו הופכת את ההסתמכות על שירות back-end להסרת הטקסט לבלתי אפשרית. פתרונות קיימים בצד הלקוח (client-side) פשוט מוסיפים צורה מעל התוכן, מה שמשאיר את הטקסט המקורי ללא שינוי. האתגר היה להסיר את הטקסט לצמיתות תוך שמירה על פעולה מהירה ועל מסמך שניתן להשתמש בו.
רסטריזציה סלקטיבית של דפים: הרעיון המרכזי
במקום להפוך את כל ה-PDF לתמונה — שלב שינפח את הקובץ וישמיד את היכולת לחפש בו — הפתרון מבצע רסטריזציה רק לדפים המכילים הסתרות (redactions). דפים אלו הופכים ל-bitmaps; כל שאר הדפים נשארים כ-PDF וקטורי, מה ששומר על אפשרות בחירת טקסט, חיפוש וגודל קובץ קטן.
הגישה מניבה מסמך שמרגיש רגיל: 19 דפים נשארים חדים וניתנים לחיפוש, בעוד שהדף הרגיש היחיד הוא תמונה מבוססת פיקסלים בלבד, שבה המידע המוסתר כבר אינו קיים.
שלושה כללים מעשיים להמרה אמינה
- רינדור בקנה מידה של פי שלושה – ה-bitmap נוצר ברזולוציה הגבוהה פי שלושה מהרזולוציה הרגילה של הדף. רינדור ברזולוציה נמוכה נראה מטושטש לצד הדפים הוקטוריים שמסביב, מה שעלול לעורר חשד או פשוט להיראות לא מקצועי.
- מיזוג כל האלמנטים הוויזואליים לתוך ה-bitmap – הערות (annotations), חתימות, סימני מים והמלבן של ההסתרה מורכבים יחד לפני שהדף עובר רסטריזציה. ערבוב של הערות וקטוריות עם תמונה רסטרית באותו דף עלול לבלבל קוראי PDF ולהוביל לשגיאות תצוגה.
- עיגון ל-viewport, לא לפי פיקסלים – הערות קשורות לקואורדינטות ה-viewport של הדף. כאשר משתמש מבצע זום, האלמנטים נשארים מיושרים במקום לזוז או להשתנות בקנה מידה לא עקבי, מה שהיה עלול לחשוף את הטקסט שמתחתיהם.
הגנה מפני race conditions
רינדור של כל דף הוא משימה אסינכרונית. אם משתמש משנה את גודל חלון הדפדפן במהירות, מספר משימות רינדור עלולות לחפוף, מה שיוצר פריימים שבורים או חופפים על ה-canvas. המימוש מציג render token לכל דף: כל בקשת רינדור חדשה מבטלת את ה-token הקודם, מה שגורם למשימה הישנה לבטל את עצמה. התוצאה היא חוויה חלקה וללא תקלות (glitch-free), גם תחת שינויי UI מהירים.
איך נראים הפשרות (trade-offs)
הפיכת דף ל-bitmap מסירה כל טקסט מוסתר, אך היא גם מוותרת על היכולת לחפש או להעתיק את תוכן הדף.
לאן זה יכול להוביל בהמשך
שורה תחתונה
קופסה שחורה פשוטה אינה מוחקת נתונים; היא רק מסתירה אותם. על ידי המרת הדפים הזקוקים להסתרה בלבד ל-bitmaps ברזולוציה גבוהה והשארת שאר ה-PDF מבוסס וקטור, עורך הפועל בדפדפן בלבד יכול למחוק לצמיתות טקסט רגיש תוך שמירה על מסמך מהיר, ניתן לחיפוש ופרטי. השיטה מאזנת בין אבטחה לשימושיות, אך על המשתמשים לשים לב להשפעה המצטברת על גודל הקובץ ועל יכולת החיפוש כאשר מבצעים הסתרה של דפים רבים.
