พร็อพเพอร์ตี้ THotPDF.LinearizeOutput
คุมว่าจะเขียนเอกสารที่เพิ่งสร้างใหม่เป็น layout แบบ linearized ที่เรียงตามลำดับ dependency เพื่อแสดงหน้าแรกเร็วบน transport แบบ byte range ของ HTTP หรือไม่
การประกาศ
// Delphi
property LinearizeOutput: Boolean;
// C++Builder
__property bool LinearizeOutput;
ค่าเริ่มต้น
False
ผังเอาต์พุต
เมื่อเปิดก่อน BeginDoc และ EndDoc HotPDF จะรัน layout pass ที่มีขอบเขตแล้วเขียน destination stream ลงตรง ๆ ตามลำดับ linearized
- dictionary ของพารามิเตอร์ linearization อยู่ใน 1024 ไบต์แรก
- หน้าแรกกับ dependency ส่วนตัวของมันมาก่อนส่วนของหน้าถัด ๆ ไป
- dependency ที่ใช้ร่วมกันถูกจับกลุ่มไว้ ผู้อ่านที่รู้เรื่อง range จึงตัดคำขอที่ซ้ำซ้อนได้
- hint stream หลักเก็บตาราง hint ของ page offset และ shared object
- ตาราง cross-reference ชุดแรกช่วยให้เข้าถึงหน้าแรกได้เร็ว ส่วนตารางหลักปิดท้ายเอกสาร
ความเข้ากันได้และข้อจำกัด
- linearization ต้องการ PDF 1.2 ขึ้นไป ถ้าเวอร์ชันที่เลือกไว้เก่ากว่า HotPDF จะอัปเกรดให้เอง เว้นแต่เปิด
StrictVersionLockไว้ ซึ่งการเขียนจะโยน exception - ตัวเขียนแบบ linearized จะส่งออกตาราง cross-reference แบบข้อความดั้งเดิมและ indirect object ที่ไม่แพ็ก แม้จะเปิด
UseXRefStreamหรือUseObjectStreamsก็ตาม - รูปแบบ hint table ใช้ offset 32 บิต เอาต์พุตตั้งแต่ 4 GiB ขึ้นไปจึงถูกปฏิเสธด้วย exception ที่บอกสาเหตุชัด
- เว็บเซิร์ฟเวอร์หรือ storage transport ต้องรองรับคำขอแบบ byte range จึงจะส่งหน้าแรกให้เร็วได้
- property นี้เปลี่ยนเอาต์พุตของเอกสารที่สร้างใหม่ ไม่ได้โหลด PDF ระยะไกลที่มีอยู่แบบไล่ระดับ
ตัวอย่าง Delphi
PDF := THotPDF.Create(nil);
try
PDF.FileName := 'fast-view.pdf';
PDF.Version := pdf17;
PDF.LinearizeOutput := True;
PDF.BeginDoc;
PDF.Canvas.TextOut(72, 72, 'First page');
PDF.EndDoc;
finally
PDF.Free;
end;
C++Builder example
std::unique_ptr<THotPDF> pdf(new THotPDF(nullptr));
pdf->FileName = L"fast-view.pdf";
pdf->Version = pdf17;
pdf->LinearizeOutput = true;
pdf->BeginDoc();
pdf->Canvas->TextOut(72, 72, L"First page");
pdf->EndDoc();