Scalable and Random-Access PDF Loading

HotPDF รักษาไฟล์ที่โหลดขนาดใหญ่ให้ตอบสนองโดยการหน่วงเวลาการคัดลอก stream และการแจงนับอ็อบเจ็กต์ที่ถูกบีบอัดจนกว่าข้อมูลจะถูกต้องการ

หน้าต่าง stream แบบ file-backed

เอกสารที่ไม่ได้เข้ารหัสซึ่งเปิดด้วย LoadFromFile จะเก็บเนื้อหา stream ที่ไม่เปลี่ยนแปลงได้เป็นช่วง source-file

การอ่านจะ seek ไปยังช่วงที่ต้องการและปล่อย source handle ทันที ดังนั้นไฟล์ต้นฉบับยังคงสามารถแทนที่ได้บน Windows

OpenLoadedStreamSourceSlice สร้าง view แบบอ่านอย่างเดียวที่เป็นอิสระเหนือช่วงต้นทางที่ไม่ถูกกรองโดยไม่ต้องคัดลอกหรือ materialise stream แบบ lazy

การเขียนครั้งแรกจะ materialise stream ในหน่วยความจำเมื่อมันอยู่ที่หรือต่ำกว่า LoadedStreamMemoryThreshold หรือใน temporary file ที่เป็นเจ้าของเองเมื่อมันใหญ่กว่า

object stream แบบ lazy

คอนเทนเนอร์ /Type /ObjStm ที่ถอดรหัสแต่ละตัวจะถูกจัดทำดัชมีตามเลขอ็อบเจ็กต์ xref ที่เชื่อถือได้โดยไม่ต้องแจงนับสมาชิกทุกตัวระหว่างการเปิด

Catalog, page-tree และการแก้ไข link ในภายหลังจะ materialise สมาชิกแต่ละตัวครั้งเดียวและนำอ็อบเจ็กต์ที่แจงนับแล้วกลับมาใช้ใหม่

การเขียนใหม่แบบเต็มจะ materialise สมาชิกที่เหลือทั้งหมดโดยอัตโนมัติ ขณะที่การบันทึกแบบ file-backed ที่ไม่เปลี่ยนแปลงสามารถรักษา byte ต้นฉบับได้โดยตรง

ReleaseDecodedStreamsAfterSave ปล่อยคอนเทนเนอร์ object-stream เฉพาะหลังจากสมาชิกที่จัดทำดัชมีทุกตัวถูก materialise แล้ว และ ReleaseLoadedDecodedStreamCaches เปิดเผยการปล่อยที่ปลอดภัยเดียวกันตามคำขอ

random access แบบกำหนดเอง

สืบทอดจาก THPDFRandomAccessSource และ implement GetSize พร้อมกับ ReadAt เพื่อโหลดจาก HTTP range, ฐานข้อมูล, ไฟล์บีบอัด หรือพื้นที่จัดเก็บเสมือน; override IsRangeAvailable เมื่อช่วงที่ดึงมาสามารถมาถึงอย่างเป็นอิสระ

LoadFromRandomAccessSource ปรับ source ให้เข้ากับ parser ที่สามารถ seek ได้ของ HotPDF และสามารถเป็นเจ้าของ source สำหรับอายุการใช้งานของเอกสารได้ตามตัวเลือก

ความพร้อมใช้งานแบบ linearized แบบก้าวหน้า

GetProgressiveLinearizedLoadInfo อ่านเฉพาะ first-object probe ที่มีขอบเขต, ตรวจสอบ /L, /O, /E, /N และ /T และรายงานช่วง first-page prefix พร้อมกับ main-xref tail ที่จำเป็นสำหรับการแสดงผลล่วงหน้า

ReadProgressiveLinearizedFirstPageSection คัดลอกส่วน first-page ที่พร้อมใช้งานในก้อน 64 KiB หลังจากทั้งสองช่วงที่จำเป็นปรากฏ ขณะที่การยกเลิกการทำงานยังคงใช้งานอยู่ระหว่างการอ่าน

THPDFProgressiveLoadStatus แยกแยะส่วนหัวที่ไม่พร้อมใช้งาน, source ที่ไม่ใช่ linearized หรือไม่ถูกต้อง, ช่วง first-page ที่ขาดหายไป, ความพร้อมของ first-page และความพร้อมของเอกสารทั้งหมด

การเพิ่มประสิทธิภาพรูปภาพแบบขนานและ stream ที่มีอัตราส่วนสูง

OptimizeLoadedStreams สามารถเลือก frmHighRatio เพื่อลองกลยุทธ์ zlib แบบ deterministic สี่แบบที่การบีบอัดสูงสุดและเก็บ Flate stream ที่เล็กที่สุดที่เข้ากันได้กับมาตรฐาน

OptimizeLoadedImagesParallel ถอดรหัส image stream ที่มีสิทธิ์เข้าสู่พื้นที่จัดเก็บ adaptive ที่มีขอบเขต, บีบอัดจนถึงขีดจำกัด worker ของผู้เรียก และ commit ผลลัพธ์แบบอนุกรมตามลำดับ source-object เฉพาะเมื่อได้การประหยัด byte ตามที่ร้องขอ

การวินิจฉัย

ดูเพิ่มเติม: LoadFromRandomAccessSource, GetProgressiveLinearizedLoadInfo, ReadProgressiveLinearizedFirstPageSection, OptimizeLoadedImagesParallel, OpenLoadedStreamSourceSlice, SourceBacked, LoadedStreamMemoryThreshold, ReleaseLoadedDecodedStreamCaches, DecompressAllObjectStreams