setResolution($dpi, $dpi); $imagick->readImage($inputPdf); $nbPages = $imagick->getNumberImages(); $imageFiles = []; for ($i = 0; $i < $nbPages; $i++) { $imagick->setIteratorIndex($i); $page = $imagick->getImage(); // important : forcer un fond blanc si le PDF avait de la transparence $page->setImageBackgroundColor('white'); $page = $page->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); // sortie en JPEG $page->setImageFormat('jpeg'); $page->setImageCompression(Imagick::COMPRESSION_JPEG); $page->setImageCompressionQuality($quality); $imgPath = sprintf('%s/page-%03d.jpg', $tmpDir, $i + 1); $page->writeImage($imgPath); $imageFiles[] = $imgPath; $page->clear(); $page->destroy(); } // 1) on essaie img2pdf (plus propre) $escapedImages = array_map('escapeshellarg', $imageFiles); $cmd = 'img2pdf ' . implode(' ', $escapedImages) . ' -o ' . escapeshellarg($outputPdf); exec($cmd, $o1, $r1); if ($r1 !== 0) { // 2) fallback : ImageMagick // attention : certaines installations utilisent "convert" au lieu de "magick" $cmd2 = 'magick ' . implode(' ', $escapedImages) . ' -density ' . intval($dpi) . ' -compress jpeg ' . escapeshellarg($outputPdf); exec($cmd2, $o2, $r2); if ($r2 !== 0) { throw new Exception("Impossible de recomposer le PDF (img2pdf puis magick ont échoué)"); } } // nettoyage (optionnel) foreach ($imageFiles as $f) { @unlink($f); } @rmdir($tmpDir); } catch (Exception $e) { echo "Erreur : " . $e->getMessage(); exit(); } // Fin conversion // supprimer $inputPdf @unlink($inputPdf); $t_html ='