From 4b7203e5e90420eb2111683569a26a4e1209bc3e Mon Sep 17 00:00:00 2001 From: atm-jonathan Date: Fri, 29 May 2026 13:59:09 +0200 Subject: [PATCH] Fix: $nexY cross-page corruption when MAIN_PDF_DATA_ON_FIRST_PAGE is enabled When MAIN_PDF_DATA_ON_FIRST_PAGE is set and a product line description straddles two pages, $nexY was calculated on $pageposafter then corrupted by $nexY = max($pdf->GetY(), $nexY) calls in the column printing loop (which runs on $pageposbefore). This caused blank pages or wrong vertical positioning of subsequent lines. Fix: save $nexYAfterDesc before setPage($pageposbefore), then restore $nexY and switch back to $pageposafter after all columns are printed. Affected models: pdf_cyan, pdf_eratosthene, pdf_cornas, pdf_zenith, pdf_sponge, pdf_eagle_proforma, pdf_standard_asset, pdf_storm. --- .../core/modules/asset/doc/pdf_standard_asset.modules.php | 7 +++++++ .../core/modules/commande/doc/pdf_eratosthene.modules.php | 8 +++++++- htdocs/core/modules/delivery/doc/pdf_storm.modules.php | 7 +++++++ htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 7 +++++++ htdocs/core/modules/propale/doc/pdf_cyan.modules.php | 7 +++++++ .../stocktransfer/doc/pdf_eagle_proforma.modules.php | 8 +++++++- .../modules/supplier_order/doc/pdf_cornas.modules.php | 7 +++++++ .../modules/supplier_proposal/doc/pdf_zenith.modules.php | 7 +++++++ 8 files changed, 56 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php index ae5823861c4b7..ac08b1fffc372 100644 --- a/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php +++ b/htdocs/core/modules/asset/doc/pdf_standard_asset.modules.php @@ -575,6 +575,7 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } $nexY = $pdf->GetY(); + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); $pdf->setPage($pageposbefore); $pdf->setTopMargin($this->marge_haute); @@ -608,6 +609,12 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i, diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index c0311205655f6..de73d33fc989a 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -617,7 +617,7 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede $nexY = max($pdf->GetY(), $posYAfterImage); - + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); @@ -695,6 +695,12 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i, diff --git a/htdocs/core/modules/delivery/doc/pdf_storm.modules.php b/htdocs/core/modules/delivery/doc/pdf_storm.modules.php index 56f71ce36e887..493741246e481 100644 --- a/htdocs/core/modules/delivery/doc/pdf_storm.modules.php +++ b/htdocs/core/modules/delivery/doc/pdf_storm.modules.php @@ -449,6 +449,7 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } $nexY = $pdf->GetY(); + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); $pdf->setPage($pageposbefore); $pdf->setTopMargin($this->marge_haute); @@ -498,6 +499,12 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede $pdf->SetLineStyle(array('dash'=>0)); } + // Restore nexY from the correct page when content was printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $nexY += 2; // Add space between lines // Detect if some page were added automatically and output _tableau for past pages diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index d62ad0c7e71de..587b399f33184 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -775,6 +775,7 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } $nexY = max($pdf->GetY(), $posYAfterImage, $posYAfterDescription); + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); $pdf->setPage($pageposbefore); @@ -858,6 +859,12 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i, diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index dba0f3c90f126..2a7c5fafeb53a 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -632,6 +632,7 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } $nexY = $pdf->GetY(); + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); $pdf->setPage($pageposbefore); @@ -708,6 +709,12 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i, diff --git a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php index c8982040b2c4c..41358eb4a8139 100644 --- a/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php +++ b/htdocs/core/modules/stocktransfer/doc/pdf_eagle_proforma.modules.php @@ -592,7 +592,7 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede $nexY = max($pdf->GetY(), $posYAfterImage); - + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); @@ -663,6 +663,12 @@ public function write_file($object, $outputlangs, $srctemplatepath = '', $hidede } } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i, diff --git a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php index 067211b1cc143..71887de2ac584 100644 --- a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php @@ -567,6 +567,7 @@ public function write_file($object, $outputlangs = '', $srctemplatepath = '', $h } $nexY = $pdf->GetY(); + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); $pdf->setPage($pageposbefore); $pdf->setTopMargin($this->marge_haute); @@ -635,6 +636,12 @@ public function write_file($object, $outputlangs = '', $srctemplatepath = '', $h } } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i, diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_zenith.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_zenith.modules.php index 877040c519dcb..62cfdc643a27c 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_zenith.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_zenith.modules.php @@ -566,6 +566,7 @@ public function write_file($object, $outputlangs = '', $srctemplatepath = '', $h } $nexY = $pdf->GetY(); + $nexYAfterDesc = $nexY; $pageposafter = $pdf->getPage(); $pdf->setPage($pageposbefore); $pdf->setTopMargin($this->marge_haute); @@ -634,6 +635,12 @@ public function write_file($object, $outputlangs = '', $srctemplatepath = '', $h } } + // Restore nexY from the correct page when prices were printed on a previous page + if ($pageposafter > $pageposbefore && !empty($showpricebeforepagebreak)) { + $nexY = $nexYAfterDesc; + $pdf->setPage($pageposafter); + } + $parameters = array( 'object' => $object, 'i' => $i,