Salta ai contenuti
getnextpdf.com

Pro edizione

Flow Layout — Riferimento approfondito

Questa pagina è il riferimento approfondito del modulo Pro Flow Layout. Copre il motore di posizionamento, il modello degli elementi, le strategie di interruzione di pagina, i loro contratti di comportamento e le loro modalità di errore. StreamingLayoutEngine percorre in ordine un elenco di valori FlowElement. Assegna a ciascuno un indice di pagina a base zero e una posizione all’interno di una LayoutRegion. Il risultato è un LayoutResult di record PlacedElement immutabili. Il modulo calcola solo il posizionamento; non esegue alcun rendering e nessuna operazione di I/O.

Questa funzionalità è distribuita in NextPDF Pro (nextpdf/pro) e si attiva con un envelope di licenza di livello Pro. Un deployment privo di tale titolo non carica le classi della funzionalità. Confronta le edizioni e ottieni una licenza.

Non esiste alcun flag di licenza per singola funzionalità. È una funzionalità dell’edizione Pro.

Tutti i simboli risiedono nel namespace NextPDF\Pro\FlowLayout. Tutti i value object sono final e immutabili.

SimboloParametriComportamento predefinitoRestituisceSolleva o fallisce conNote
StreamingLayoutEngine::__constructLayoutRegion $region, PageBreakStrategy $strategy = PageBreakStrategy::GreedyVincola un’area di contenuto per pagina a una strategia di interruzioneStreamingLayoutEngineLa strategia predefinita è Greedy.
StreamingLayoutEngine::layoutlist<FlowElement> $elementsSingolo passaggio in avanti; posizionamento sequenziale con interruzioni di pagina guidate dalla strategiaLayoutResultNon solleva maiUn elenco vuoto produce una pagina vuota.
StreamingLayoutEngine::withStrategyPageBreakStrategy $strategyDeriva un nuovo motore con la stessa regioneselfIl ricevente rimane invariato.
StreamingLayoutEngine::withRegionLayoutRegion $regionDeriva un nuovo motore con la stessa strategiaselfIl ricevente rimane invariato.
FlowElement::__constructFlowElementType $type, string $content, float $widthPt = 0, float $heightPt = 0, float $marginTopPt = 0, float $marginBottomPt = 0, bool $keepWithNext = falseValue object di elemento immutabileFlowElementUnico percorso di costruzione per gli elementi Table.
FlowElement::textstring $content, float $heightElemento di testo con altezza misurata dal chiamanteself (statico)La larghezza 0 si risolve nella larghezza della regione al momento del posizionamento.
FlowElement::imagestring $path, float $width, float $heightElemento immagine; content contiene il percorsoself (statico)Il motore non apre mai il file.
FlowElement::spacerfloat $heightSpazio verticale con contenuto vuotoself (statico)
FlowElement::pageBreakMarcatore di interruzione esplicitoself (statico)Non emette alcun PlacedElement.
FlowElement::totalHeightAltezza più i margini superiore e inferiorefloatTutti i controlli di adattamento usano questo valore.
FlowElementTypecasi enum Text, Image, Table, Spacer, PageBreakBasata su stringhe: text, image, table, spacer, page_break
FlowElementType::isBreakableText e Table restituiscono true; gli altri restituiscono falseboolSolo classificazione; vedere il contratto di posizionamento atomico più avanti.
LayoutRegion::__constructfloat $x, float $y, float $width, float $heightRiquadro di contenuto con origine in alto a sinistra, misurato in puntiLayoutRegionNessuna validazione; i valori sono assunti così come forniti.
LayoutRegion::containsfloat $px, float $pyTest di appartenenza del punto alla regione, confini inclusibool
LayoutRegion::remainingHeightfloat $currentYAltezza della regione meno l’offset verticale consumatofloatZero o negativo una volta che il cursore ha ecceduto.
LayoutResult::__constructlist<PlacedElement> $placements, int $pageCount, float $totalHeightPtEsito del layout immutabileLayoutResult
LayoutResult::placementsOnPageint $pageIndexFiltra i posizionamenti per indice di pagina a base zerolist<PlacedElement>L’elenco restituito è re-indicizzato.
LayoutResult::isEmptyTrue quando nessun elemento è stato posizionatoboolTrue per input vuoto e composto da soli marcatori di interruzione.
PageBreakStrategycasi enum Greedy, AvoidOrphans, KeepTogetherBasata su stringhe: greedy, avoid_orphans, keep_together
PageBreakStrategy::labelEtichetta leggibile della strategiastring
PlacedElement::__constructFlowElement $element, int $pageIndex, float $x, float $y, float $width, float $heightRecord di posizionamento immutabilePlacedElementLe coordinate sono in punti, origine in alto a sinistra.
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() esegue un singolo passaggio in avanti sull’elenco di input. Per ogni elemento verifica l’adattamento, interrompe la pagina quando necessario, quindi registra un PlacedElement. Un elenco di input vuoto restituisce un LayoutResult senza posizionamenti, con un conteggio di pagine pari a 1 e un’altezza totale pari a 0.

La geometria di posizionamento è deterministica:

  • x è il bordo sinistro della regione.
  • y è la posizione corrente del cursore più il margine superiore dell’elemento.
  • width è il valore widthPt dell’elemento quando è positivo, altrimenti la larghezza della regione.
  • height è il valore heightPt dell’elemento, esattamente come fornito.

Dopo ogni posizionamento il cursore avanza di totalHeight(), margini inclusi. La stessa quantità si accumula in LayoutResult::totalHeightPt.

Regole di interruzione di pagina, in ordine di valutazione:

  • Un elemento PageBreak esplicito incrementa l’indice di pagina e reimposta il cursore alla sommità della regione. Non emette alcun posizionamento e non aggiunge nulla all’altezza totale.
  • Quando il valore totalHeight() di un elemento supera l’altezza rimanente, il motore interrompe — a meno che il cursore non si trovi già alla sommità della pagina.
  • Greedy non aggiunge alcuna condizione ulteriore: gli elementi che entrano vengono sempre posizionati.
  • AvoidOrphans interrompe prima di un elemento che entra quando lo spazio residuo dopo il posizionamento sarebbe positivo ma inferiore alla metà dell’altezza richiesta dall’elemento stesso. L’altezza dell’elemento stesso è l’unità di riferimento, con un divisore fisso pari a due; nessuna metrica di font è coinvolta. Non interrompe mai alla sommità di una pagina.
  • KeepTogether interrompe prima di un elemento che entra quando il suo flag keepWithNext è impostato, esiste un elemento successivo, il cursore non è alla sommità della pagina e il valore combinato totalHeight() di entrambi gli elementi supera lo spazio rimanente. Il flag sull’elemento finale non ha alcun effetto.

Posizionamento atomico: il motore posiziona ogni elemento come unità. Non spezza mai il contenuto di un elemento tra più pagine. FlowElementType::isBreakable() classifica quali tipi un chiamante può pre-suddividere in elementi più piccoli; il motore stesso non lo consulta.

Assenza di stato e determinismo: il motore mantiene solo la propria regione e strategia. layout() non condivide alcuno stato tra le chiamate e input identici producono risultati identici. withStrategy() e withRegion() restituiscono nuovi motori e non mutano mai il ricevente.

  • Nessun metodo di questo modulo solleva eccezioni. Non esiste alcuna gerarchia di eccezioni da intercettare.
  • I costruttori non validano nulla. Dimensioni della regione negative o nulle, altezze di elemento negative e margini negativi sono accettati e attraversano l’aritmetica senza alterazioni.
  • Un elemento più alto della regione viene comunque posizionato. Alla sommità di una pagina viene posizionato lì ed eccede; altrove il motore interrompe prima e l’elemento eccede una pagina nuova. L’elemento successivo attiva poi sempre un’interruzione, quindi l’eccedenza è confinata a una sola pagina.
  • Un PageBreak iniziale posiziona il primo elemento di contenuto sull’indice di pagina 1, dando un conteggio di pagine di almeno 2.
  • Elementi PageBreak consecutivi fanno avanzare ciascuno il contatore di pagine, producendo pagine vuote. Uno finale lascia un’ultima pagina vuota in pageCount.
  • Keep-together si applica solo quando entrambi gli elementi accoppiati entrano insieme in un’unica pagina. Una coppia la cui altezza combinata supera una pagina intera si spezza comunque.
  • Un valore widthPt non positivo si risolve nella larghezza della regione; il controllo di sostituzione è strettamente maggiore di zero.
  • remainingHeight() può restituire zero o un valore negativo una volta che il cursore ha ecceduto. contains() tratta il confine della regione come interno.
  • placementsOnPage() con un indice fuori intervallo restituisce un elenco vuoto.
  • Questo modulo non esegue alcuna operazione crittografica e non definisce alcun comportamento specifico di FIPS.

Flow Layout implementa il comportamento di posizionamento definito da NextPDF. Non punta ad alcuno standard esterno di layout o tipografia, pertanto questa pagina non riporta alcuna tabella di citazioni normative. Le strategie di interruzione di pagina sono semantiche NextPDF; non sono implementazioni delle proprietà di frammentazione CSS né di alcun modello keep XSL-FO. Tutte le dimensioni sono espresse in punti, corrispondenti alle unità che il writer Core consuma.

Queste affermazioni descrivono solo le funzionalità. NextPDF non detiene alcuna certificazione di conformità e nessuna dichiarazione di certificazione è resa o implicita.

  • Misurare il contenuto a monte. Il motore consuma le altezze fornite dal chiamante; non dispone di metriche di font e non esegue alcuna misurazione del testo.
  • Pre-suddividere i contenuti lunghi di testo o tabella in più elementi prima del layout. Usare isBreakable() per decidere quali tipi un suddivisore può spezzare.
  • Riutilizzare un unico motore per ogni geometria di pagina. Derivare le varianti in modo economico con withStrategy() e withRegion().
  • Raggruppare l’output per pagina con placementsOnPage() quando si esegue il rendering pagina per pagina.
  • Il layout è un singolo passaggio, lineare rispetto al numero di elementi, e non conserva alcun albero del documento. I risultati sono deterministici, il che si presta ai test con golden file.
  • Per il rendering da HTML a PDF, usare invece la pipeline HTML di Core; questo modulo non è un motore HTML o CSS.

Questa pagina documenta solo il comportamento osservabile esternamente e la superficie API pubblica supportata. I percorsi interni dei namespace, le classi helper, le tabelle dei meccanismi, i nomi dei file di runbook e i prefissi dei ticket sono fuori ambito.