Lewati ke konten
getnextpdf.com

Pro edisi

Flow Layout — Referensi Mendalam

Halaman ini adalah referensi mendalam untuk modul Pro Flow Layout. Halaman ini mencakup mesin penempatan, model elemen, strategi pemutusan halaman, kontrak perilakunya, dan mode kegagalannya. StreamingLayoutEngine menelusuri daftar nilai FlowElement secara berurutan. Ia menetapkan pada masing-masing sebuah indeks halaman berbasis nol dan sebuah posisi di dalam sebuah LayoutRegion. Hasilnya adalah sebuah LayoutResult berupa record PlacedElement yang immutable. Modul ini hanya menghitung penempatan; ia tidak merender apa pun dan tidak melakukan I/O.

Kapabilitas ini hadir dalam NextPDF Pro (nextpdf/pro) dan aktif dengan sebuah envelope lisensi tier Pro. Sebuah deployment tanpa entitlement tersebut tidak memuat kelas-kelas kapabilitas ini. Bandingkan edisi dan dapatkan lisensi.

Tidak ada flag lisensi per-fitur. Ini adalah kapabilitas edisi Pro.

Semua simbol berada dalam namespace NextPDF\Pro\FlowLayout. Semua value object bersifat final dan immutable.

SymbolParametersDefault behaviorReturnsThrows or fails withNotes
StreamingLayoutEngine::__constructLayoutRegion $region, PageBreakStrategy $strategy = PageBreakStrategy::GreedyMengikat area konten per-halaman ke sebuah strategi pemutusanStreamingLayoutEngineStrategi bawaannya adalah Greedy.
StreamingLayoutEngine::layoutlist<FlowElement> $elementsSatu lintasan maju; penempatan berurutan dengan pemutusan halaman yang digerakkan strategiLayoutResultTidak pernah throwDaftar kosong menghasilkan satu halaman kosong.
StreamingLayoutEngine::withStrategyPageBreakStrategy $strategyMenurunkan sebuah engine baru dengan region yang samaselfReceiver tidak berubah.
StreamingLayoutEngine::withRegionLayoutRegion $regionMenurunkan sebuah engine baru dengan strategi yang samaselfReceiver tidak berubah.
FlowElement::__constructFlowElementType $type, string $content, float $widthPt = 0, float $heightPt = 0, float $marginTopPt = 0, float $marginBottomPt = 0, bool $keepWithNext = falseValue object elemen yang immutableFlowElementSatu-satunya jalur konstruksi untuk elemen Table.
FlowElement::textstring $content, float $heightElemen text dengan tinggi yang diukur oleh callerself (static)Width 0 di-resolve ke lebar region saat penempatan.
FlowElement::imagestring $path, float $width, float $heightElemen image; content membawa path-nyaself (static)Engine tidak pernah membuka file.
FlowElement::spacerfloat $heightWhitespace vertikal dengan content kosongself (static)
FlowElement::pageBreakPenanda pemutusan eksplisitself (static)Tidak memancarkan PlacedElement.
FlowElement::totalHeightTinggi ditambah margin atas dan bawahfloatSemua pemeriksaan kecukupan menggunakan nilai ini.
FlowElementTypecase enum Text, Image, Table, Spacer, PageBreakBerbasis string: text, image, table, spacer, page_break
FlowElementType::isBreakableText dan Table mengembalikan true; lainnya mengembalikan falseboolKlasifikasi saja; lihat kontrak penempatan atomik di bawah.
LayoutRegion::__constructfloat $x, float $y, float $width, float $heightKotak konten beranchor kiri-atas, diukur dalam pointLayoutRegionTanpa validasi; nilai diterima apa adanya.
LayoutRegion::containsfloat $px, float $pyUji titik-dalam-region yang inklusif terhadap batasbool
LayoutRegion::remainingHeightfloat $currentYTinggi region dikurangi offset vertikal yang terpakaifloatNol atau negatif setelah kursor meluap.
LayoutResult::__constructlist<PlacedElement> $placements, int $pageCount, float $totalHeightPtHasil layout yang immutableLayoutResult
LayoutResult::placementsOnPageint $pageIndexMenyaring penempatan berdasarkan indeks halaman berbasis nollist<PlacedElement>Daftar yang dikembalikan diindeks ulang.
LayoutResult::isEmptyTrue ketika tidak ada elemen yang ditempatkanboolTrue untuk input kosong dan input hanya berisi pemutusan.
PageBreakStrategycase enum Greedy, AvoidOrphans, KeepTogetherBerbasis string: greedy, avoid_orphans, keep_together
PageBreakStrategy::labelLabel strategi yang terbaca manusiastring
PlacedElement::__constructFlowElement $element, int $pageIndex, float $x, float $y, float $width, float $heightRecord penempatan yang immutablePlacedElementKoordinat dalam point, beranchor kiri-atas.
public function layout(array $elements): LayoutResult
public function withStrategy(PageBreakStrategy $strategy): self
public function withRegion(LayoutRegion $region): self
public static function text(string $content, float $height): self
public static function image(string $path, float $width, float $height): self
public static function spacer(float $height): self
public static function pageBreak(): self

StreamingLayoutEngine::layout() melakukan satu lintasan maju atas daftar input. Untuk setiap elemen ia memeriksa kecukupan, memutus halaman ketika diperlukan, lalu mencatat sebuah PlacedElement. Daftar input yang kosong mengembalikan sebuah LayoutResult tanpa penempatan, dengan page count 1, dan total height 0.

Geometri penempatan bersifat deterministik:

  • x adalah tepi kiri region.
  • y adalah posisi kursor saat ini ditambah margin atas elemen.
  • width adalah widthPt elemen ketika positif, jika tidak maka lebar region.
  • height adalah heightPt elemen, persis sebagaimana diberikan.

Setelah setiap penempatan kursor maju sebesar totalHeight(), termasuk margin. Jumlah yang sama terakumulasi ke dalam LayoutResult::totalHeightPt.

Aturan pemutusan halaman, dalam urutan evaluasi:

  • Sebuah elemen PageBreak eksplisit menaikkan indeks halaman dan mereset kursor ke bagian atas region. Ia tidak memancarkan penempatan dan tidak menambah apa pun ke total height.
  • Ketika totalHeight() sebuah elemen melampaui tinggi yang tersisa, engine memutus — kecuali kursor sudah berada di bagian atas halaman.
  • Greedy tidak menambah kondisi lebih lanjut: elemen yang muat selalu ditempatkan.
  • AvoidOrphans memutus sebelum sebuah elemen yang muat ketika ruang yang tersisa setelah penempatan akan positif namun di bawah setengah tinggi yang dibutuhkan elemen itu sendiri. Tinggi elemen itu sendiri adalah unit acuan, dengan pembagi tetap dua; tidak ada metrik font yang terlibat. Ia tidak pernah memutus di bagian atas sebuah halaman.
  • KeepTogether memutus sebelum sebuah elemen yang muat ketika flag keepWithNext-nya di-set, ada elemen berikutnya, kursor tidak berada di bagian atas halaman, dan gabungan totalHeight() dari kedua elemen melampaui ruang yang tersisa. Flag pada elemen terakhir tidak berpengaruh.

Penempatan atomik: engine menempatkan setiap elemen sebagai satu unit. Ia tidak pernah memecah content elemen antar halaman. FlowElementType::isBreakable() mengklasifikasikan tipe mana yang boleh dipecah-lebih-dulu oleh caller menjadi elemen-elemen yang lebih kecil; engine itu sendiri tidak mengonsultasikannya.

Kenirstatusan dan determinisme: engine hanya menyimpan region dan strateginya. layout() tidak berbagi state antar pemanggilan, dan input yang identik menghasilkan hasil yang identik. withStrategy() dan withRegion() mengembalikan engine baru dan tidak pernah memutasi receiver.

  • Tidak ada metode dalam modul ini yang throw. Tidak ada hierarki exception untuk ditangkap.
  • Konstruktor tidak memvalidasi apa pun. Dimensi region negatif atau nol, tinggi elemen negatif, dan margin negatif diterima dan mengalir melalui aritmatika tanpa perubahan.
  • Sebuah elemen yang lebih tinggi daripada region tetap ditempatkan. Di bagian atas sebuah halaman ia ditempatkan di sana dan meluap; di tempat lain engine memutus terlebih dahulu dan ia meluap pada halaman baru. Elemen berikutnya kemudian selalu memicu sebuah pemutusan, sehingga luapan terbatas pada satu halaman.
  • Sebuah PageBreak di awal menempatkan elemen content pertama pada indeks halaman 1, memberikan page count sekurang-kurangnya 2.
  • Elemen PageBreak yang berurutan masing-masing memajukan penghitung halaman, menghasilkan halaman kosong. Sebuah PageBreak di akhir meninggalkan sebuah halaman kosong terakhir pada pageCount.
  • Keep-together hanya berlaku ketika kedua elemen berpasangan muat bersama pada satu halaman. Sebuah pasangan yang gabungan tingginya melampaui satu halaman penuh tetap terpecah.
  • Sebuah widthPt non-positif di-resolve ke lebar region; pemeriksaan substitusinya adalah lebih besar dari nol secara ketat.
  • remainingHeight() dapat mengembalikan nol atau nilai negatif setelah kursor meluap. contains() memperlakukan batas region sebagai berada di dalam.
  • placementsOnPage() dengan indeks di luar rentang mengembalikan daftar kosong.
  • Modul ini tidak melakukan operasi kriptografis dan tidak mendefinisikan perilaku khusus FIPS.

Flow Layout mengimplementasikan perilaku penempatan yang didefinisikan NextPDF. Ia tidak menargetkan standar tata letak atau tipografi eksternal, sehingga halaman ini tidak membawa tabel sitasi normatif. Strategi pemutusan halaman adalah semantik NextPDF; keduanya bukan implementasi dari properti fragmentasi CSS atau model keep XSL-FO mana pun. Semua dimensi dinyatakan dalam point, sesuai dengan unit yang dikonsumsi oleh Core writer.

Pernyataan-pernyataan ini hanya menjelaskan kapabilitas. NextPDF tidak memegang sertifikasi kesesuaian apa pun, dan tidak ada klaim sertifikasi yang dibuat atau tersirat.

  • Ukur content di hulu. Engine mengonsumsi tinggi yang disuplai caller; ia tidak memiliki metrik font dan tidak melakukan pengukuran teks.
  • Pecah-lebih-dulu content text atau table yang panjang menjadi beberapa elemen sebelum layout. Gunakan isBreakable() untuk memutuskan tipe mana yang boleh dipecah oleh sebuah chunker.
  • Gunakan ulang satu engine per geometri halaman. Turunkan varian secara murah dengan withStrategy() dan withRegion().
  • Kelompokkan keluaran per halaman dengan placementsOnPage() ketika merender halaman demi halaman.
  • Layout adalah satu lintasan, linear terhadap jumlah elemen, dan tidak menyimpan pohon dokumen. Hasilnya deterministik, yang cocok untuk pengujian golden-file.
  • Untuk perenderan HTML-ke-PDF, gunakan Core HTML pipeline sebagai gantinya; modul ini bukan mesin HTML atau CSS.

Halaman ini hanya mendokumentasikan perilaku yang teramati secara eksternal dan permukaan API publik yang didukung. Path namespace internal, kelas helper, tabel mekanisme, nama file runbook, dan prefiks tiket berada di luar cakupan.