ทำไมแค่การวาดกล่องสีดำถึงไม่เพียงพอ
เครื่องมือ PDF ส่วนใหญ่ยอมให้ผู้ใช้ "เซ็นเซอร์" (redact) โดยการวาดสี่เหลี่ยมสีดำทับข้อความที่สำคัญ แม้ว่าสี่เหลี่ยมจะช่วยซ่อนคำบนหน้าจอ แต่ตัวอักษรที่อยู่เบื้องหลังยังคงอยู่ใน content stream ของไฟล์ ใครก็ตามสามารถเลือกข้อความที่ถูกซ่อน คัดลอก หรือใช้สคริปต์ง่ายๆ เพื่อดึงข้อมูลออกมาได้ พูดง่ายๆ ก็คือ ข้อมูลยังคงอยู่ที่นั่น กล่องสีดำเป็นเพียงแค่สิ่งที่ใช้ปกปิดทางสายตาเท่านั้น
ปัญหาที่นักพัฒนาต้องเผชิญ
ผู้เขียนต้องการ PDF editor ที่ทำงานบนเบราว์เซอร์ทั้งหมดโดยไม่ต้องอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ ข้อจำกัดนี้ทำให้ไม่สามารถพึ่งพาบริการ back-end เพื่อลบข้อความออกได้ โซลูชันฝั่ง client-side ที่มีอยู่ในปัจจุบันทำเพียงแค่การเพิ่มรูปทรงทับลงบนเนื้อหา ซึ่งทำให้ข้อความต้นฉบับยังคงอยู่ครบถ้วน ความท้าทายคือจะลบข้อความออกอย่างถาวรได้อย่างไร ในขณะที่ยังคงความรวดเร็วในการทำงานและทำให้เอกสารยังคงใช้งานได้ตามปกติ
การทำ rasterisation เฉพาะบางหน้า: แนวคิดหลัก
แทนที่จะแปลง PDF ทั้งหมดให้เป็นรูปภาพ ซึ่งเป็นขั้นตอนที่จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและทำลายความสามารถในการค้นหา โซลูชันนี้จะทำ rasterisation เฉพาะ หน้าที่มีการเซ็นเซอร์เท่านั้น หน้าเหล่านั้นจะกลายเป็น bitmap ในขณะที่หน้าอื่นๆ ทั้งหมดจะยังคงเป็น vector PDF ซึ่งช่วยรักษาความสามารถในการเลือกข้อความ การค้นหา และทำให้ขนาดไฟล์ยังคงเล็กอยู่
วิธีการนี้ทำให้ได้เอกสารที่ให้ความรู้สึกเหมือนปกติ เช่น หน้าที่เหลือ 19 หน้ายังคงความคมชัดและค้นหาได้ ในขณะที่หน้าที่มีข้อมูลสำคัญเพียงหน้าเดียวจะกลายเป็นรูปภาพแบบ pixel-only ซึ่งไม่มีข้อมูลที่ถูกซ่อนอยู่อีกต่อไป
กฎปฏิบัติ 3 ข้อเพื่อการแปลงไฟล์ที่เชื่อถือได้
- เรนเดอร์ที่ขนาด 3 เท่า (Render at three-times scale) – ไฟล์ bitmap จะถูกสร้างขึ้นด้วยความละเอียดเป็นสามเท่าของความละเอียดปกติของหน้ากระดาษ การเรนเดอร์ที่มีความละเอียดต่ำจะดูเบลอเมื่อเทียบกับหน้า vector รอบข้าง ซึ่งอาจทำให้เกิดความสงสัยหรือดูไม่เป็นมืออาชีพ
- รวมองค์ประกอบภาพทั้งหมดเข้ากับ bitmap – ทั้งคำอธิบาย (annotations), ลายเซ็น, ลายน้ำ และสี่เหลี่ยมที่ใช้เซ็นเซอร์ จะถูกรวมเข้าด้วยกันก่อนที่จะทำ rasterisation การผสมผสาน vector annotations เข้ากับ raster image ในหน้าเดียวกันอาจทำให้ PDF reader สับสน และนำไปสู่ข้อผิดพลาดในการแสดงผลได้
- ยึดตาม viewport ไม่ใช่พิกเซล – Annotations จะถูกผูกไว้กับพิกัด viewport ของหน้ากระดาษ เมื่อผู้ใช้ซูม องค์ประกอบต่างๆ จะยังคงจัดวางตำแหน่งได้ตรงกัน แทนที่จะเลื่อนหรือขยายขนาดอย่างไม่สม่ำเสมอ ซึ่งหากไม่ทำเช่นนี้อาจทำให้ข้อความที่อยู่เบื้องหลังถูกเปิดเผยออกมาได้
การป้องกันปัญหา race conditions
การเรนเดอร์แต่ละหน้าเป็นงานแบบ asynchronous หากผู้ใช้ปรับขนาดหน้าต่างเบราว์เซอร์อย่างรวดเร็ว งานเรนเดอร์หลายงานอาจเกิดขึ้นซ้อนทับกัน ทำให้เกิดเฟรมที่ผิดเพี้ยนหรือซ้อนทับกันบน canvas การนำระบบ render token ต่อหน้ามาใช้จะช่วยแก้ปัญหานี้ โดยคำขอเรนเดอร์ใหม่แต่ละครั้งจะทำให้ token ก่อนหน้าใช้งานไม่ได้ ซึ่งจะทำให้งานเก่าถูกยกเลิกไปเอง ผลลัพธ์ที่ได้คือประสบการณ์การใช้งานที่ราบรื่นและไม่มีข้อผิดพลาด แม้จะมีการเปลี่ยนแปลง UI อย่างรวดเร็วก็ตาม
ข้อแลกเปลี่ยนที่ต้องพิจารณา
การเปลี่ยนหน้ากระดาษให้เป็น bitmap จะช่วยลบข้อความที่ซ่อนอยู่ทั้งหมด แต่ก็ทำให้สูญเสียความสามารถในการค้นหาหรือคัดลอกเนื้อหาในหน้านั้นไปด้วย
ทิศทางในอนาคต
บทสรุป
กล่องสีดำธรรมดาไม่ได้ลบข้อมูล แต่มันเพียงแค่ซ่อนไว้เท่านั้น การแปลงเฉพาะหน้าที่ต้องการเซ็นเซอร์ให้เป็น bitmap ความละเอียดสูง และปล่อยให้ส่วนที่เหลือของ PDF เป็นแบบ vector จะช่วยให้ editor ที่ทำงานบนเบราว์เซอร์เพียงอย่างเดียวสามารถลบข้อความที่สำคัญออกได้อย่างถาวร ในขณะที่ยังคงทำให้เอกสารทำงานได้รวดเร็ว ค้นหาได้ และมีความเป็นส่วนตัว วิธีนี้สร้างความสมดุลระหว่างความปลอดภัยและการใช้งาน แต่ผู้ใช้ควรระวังผลกระทบสะสมต่อขนาดไฟล์และความสามารถในการค้นหาเมื่อต้องเซ็นเซอร์หลายๆ หน้า
