Constrained Streaming Layout
HotPDF สามารถวัดองค์ประกอบที่นำกลับมาใช้ใหม่ได้โดยไม่ต้องวาด, แยกย่อหน้า, แถว, คอนเทนเนอร์ และองค์ประกอบแบบกำหนดเองออกเป็นส่วนต่อที่เป็นเจ้าของเอง, ประกอบเลเยอร์หน้าที่นำกลับมาใช้ใหม่ได้, จัดเก็บหน้าที่เสร็จสมบูรณ์ในพื้นที่จัดเก็บแบบ file-backed, ใช้ข้อจำกัดการแบ่งหน้าของย่อหน้า และเปิดเผยการวินิจฉัยที่มีขอบเขต
สัญญา measure และ draw ที่นำกลับมาใช้ใหม่ได้
สืบทอดมาจาก THPDFLayoutElement และ implement Measure ที่ไม่มี side-effect พร้อมกับ Draw การวัดจะรับเพียง THPDFLayoutConstraints เท่านั้น จึงไม่มีหน้าหรือพื้นผิวการวาดของเอกสาร
MeasureLayoutElement ตรวจสอบมิติที่ไม่เป็นลบและคำนวณ Fits จากศูนย์กลางโดยใช้ข้อจำกัดความกว้างและความสูงเดียวกันกับที่ใช้สำหรับการจัดวาง
THPDFLayoutElementKind ให้ ElementKind จำแนก implementation ว่าเป็น lekParagraph, lekRow, lekContainer หรือ lekCustom ขณะที่ ElementPath จัดหาบริบทการวินิจฉัยที่คงตัว
ความเป็นเจ้าของการแยกและ overflow
องค์ประกอบที่แยกได้จะคืนค่า THPDFLayoutSplit ที่บรรจุองค์ประกอบ placed และ overflow ที่ผู้เรียกเป็นเจ้าของ PlaceLayoutElement จะวัดส่วน placed head ใหม่, วาดเฉพาะเมื่อพอดี และถ่ายโอนส่วนท้ายเข้าไปใน THPDFLayoutOverflow
THPDFLayoutOverflow บันทึกหน้าต้นทางและเส้นทางองค์ประกอบ, เป็นเจ้าของส่วนต่อโดยค่าเริ่มต้น และถ่ายโอนอย่างชัดเจนผ่าน DetachElement
เลเยอร์หน้าแบบ declarative
ลงทะเบียน callback ด้วย AddPageLayer ก่อน BeginDoc โดยเลือก plkBackground, plkHeader, plkFooter หรือ plkForeground
แต่ละ callback ทำงานตรงครั้งเดียวต่อหน้าตามลำดับ background, header, document-content, footer และ foreground และถูกแยกโดยคู่ graphics-state save และ restore
RemovePageLayer ลบการลงทะเบียนหนึ่งรายการตามตัวระบุ ขณะที่ ClearPageLayers รีเซ็ตการประกอบที่นำกลับมาใช้ใหม่ก่อนที่การสร้างเอกสารจะเริ่มขึ้น
THPDFPageLayerRegistration เก็บตัวระบุที่คงตัว, ชนิดเลเยอร์ และตัวจัดการ object-method ที่ใช้ภายในโดยรายการลงทะเบียนตามลำดับของเอกสาร
การ flush หน้าทันที
ตั้งค่า ImmediateFlushLayout ก่อน BeginDoc สำหรับรายงานที่ไม่ทราบจำนวนหน้าล่วงหน้า
เมื่อหน้าปิดลง content stream สุดท้ายที่ถูกบีบอัดหรือไม่บีบอัดจะย้ายจากหน่วยความจำไปยัง temporary-file stream ที่เป็นเจ้าของเอง ขณะที่อ็อบเจ็กต์ PDF ยังคงพร้อมใช้งานสำหรับการ finalise cross-reference และทรัพยากรตามปกติ
ImmediateFlushedPageCount และ ImmediateFlushedBytes รายงานปริมาณเนื้อหาที่จัดเก็บชั่วคราว และไฟล์ชั่วคราวจะถูกลบเมื่อ stream ที่เป็นเจ้าของถูกปล่อย
การแบ่งหน้าของย่อหน้า
ParagraphIndex := PDF.CreateParagraph(0, jtLeft, 36, 36, 36, 36);
PDF.ConfigureParagraphPagination(ParagraphIndex, True, 2, 2);
PDF.ConfigureParagraphDirection(ParagraphIndex, pdAuto);
PDF.BeginParagraph(ParagraphIndex);
PDF.CurrentParagraph.ShowUnicodeText(BodyText);
PDF.EndParagraph;
KeepWithNextย้ายย่อหน้าเมื่อมันจะใช้บรรทัดสุดท้ายที่ควรเหลือไว้สำหรับเนื้อหาถัดไปMinOrphanLinesป้องกันบรรทัดเปิดที่น้อยเกินไปจากการถูกทิ้งไว้ที่ด้านล่างของหน้าMinWidowLinesขยับการแบ่งเมื่อบรรทัดปิดที่เหลือน้อยเกินไปจะอยู่บนหน้าถัดไป- การต่ออัตโนมัติรักษาความกว้างหน้าต้นทาง, ความสูง, แบบอักษร, ระยะขอบ และการตั้งค่าย่อหน้า
- เมื่อ
ParaAutoAddPageเป็น false overflow จะหยุดบนหน้าปัจจุบันและสร้างการวินิจฉัยldkOverflow
การวินิจฉัยเลย์เอาต์
THPDFLayoutDiagnostic บันทึก THPDFLayoutDiagnosticKind, ดัชมีหน้าต้นทางและที่เกี่ยวข้อง, สี่เหลี่ยมผืนผ้าที่ได้รับผลกระทบ, จำนวนบรรทัด และเหตุผลภาษาอังกฤษสำหรับแต่ละการตัดสินใจที่เก็บไว้
THPDFLayoutDiagnosticArray ถูกคืนโดย GetLayoutDiagnostics ขณะที่ GetLayoutDiagnostic รองรับการเข้าถึงตามดัชมีโดยไม่ต้องจัดสรรสำเนา
LayoutDiagnosticLimit จำกัดระเบียนที่เก็บไว้และ LayoutDiagnosticDroppedCount รายงานการตัดสินใจที่ถูกทิ้งหลังจากถึงขีดจำกัดนั้น
ldkAutomaticPageBreakรายงานการต่อแบบปกติldkKeepWithNext,ldkOrphanControlและldkWidowControlระบุข้อจำกัดที่เคลื่อนย้ายการแบ่งldkOverflowระบุเนื้อหาที่หยุดโดยการแบ่งหน้าอัตโนมัติที่ปิดอยู่ldkImmediateFlushระบุหน้าที่ปิดแล้วและถูกย้ายไปยังพื้นที่จัดเก็บแบบ file-backedldkPageLayerระบุการผ่านเลเยอร์หน้าแบบ declarative ที่เสร็จสมบูรณ์
ทิศทางย่อหน้า
THPDFParagraphDirection จัดหา pdAuto, pdLeftToRight และ pdRightToLeft
DetectParagraphDirection ใช้การแก้ไข first-strong-character ข้ามสคริปต์ RTL ของ BMP และ supplementary-plane ดังนั้น prefix ที่เป็นกลางและ directional run รองจะไม่เลือกทิศทางหลักผิด
ใช้ ConfigureParagraphDirection สำหรับการตั้งค่าย่อหน้าแบบถาวร หรือพร็อพเพอร์ตี THPDFPara.Direction สำหรับย่อหน้าที่กำลังทำงานอยู่
ความหมายของย่อหน้า PDF/UA
Root := PDF.AddStructureElement('Document', nil);
Paragraph := PDF.BeginTaggedParagraph(Root, 'en-US', 'Accessible text');
PDF.CurrentPage.TextOut(36, 72, 0, WideString('Accessible text'));
PDF.EndTaggedParagraph;
PDF.BeginPaginationArtifact(pasHeader);
PDF.CurrentPage.TextOut(36, 20, 0, WideString('Running header'));
PDF.EndPaginationArtifact;
BeginTaggedParagraph emit ลำดับ marked-content /P มาตรฐานพร้อม MCID ที่จัดสรรแล้ว, การเชื่อมต่อ page parent-tree และค่า /Lang และ /ActualText ที่เป็นทางเลือก
THPDFPaginationArtifactSubtype จัดหา pasHeader, pasFooter, pasWatermark และ pasPageNumber โดย emit เป็นเนื้อหา /Artifact ที่มี /Type /Pagination และ subtype มาตรฐานที่ตรงกัน