From 1bf71898db4c6143cca450353dcab13171d70eb1 Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Mon, 14 Sep 2026 18:50:26 -0400 Subject: [PATCH] feat: add backgound to previews Signed-off-by: Sebastian Krupinski --- lib/Preview/Provider.php | 13 +++++++++++++ tests/php/Unit/PreviewTest.php | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/Preview/Provider.php b/lib/Preview/Provider.php index b87238d..0994f1d 100644 --- a/lib/Preview/Provider.php +++ b/lib/Preview/Provider.php @@ -76,6 +76,19 @@ final class Provider implements PreviewProviderInterface } $image->setResolution(96, 96); $image->readImage('pdf:' . stream_get_meta_data($file)['uri'] . '[0]'); + // Treat transparent PDF areas as paper in every output format. + $image->setImageBackgroundColor('white'); + $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); + // Scale the inset outline so it remains about one pixel after resizing. + $stroke = max($image->getImageWidth() / $request->maxWidth, $image->getImageHeight() / $request->maxHeight, 1); + $outline = new \ImagickDraw(); + $outline->setFillColor('transparent'); + $outline->setStrokeColor('#b8b8b8'); + $outline->setStrokeWidth($stroke); + $outline->rectangle($stroke / 2, $stroke / 2, + $image->getImageWidth() - $stroke / 2, $image->getImageHeight() - $stroke / 2); + $image->drawImage($outline); + $outline->clear(); $image->setImageFormat('png'); $png = $image->getImageBlob(); return $this->images->generate(new PreviewSource( diff --git a/tests/php/Unit/PreviewTest.php b/tests/php/Unit/PreviewTest.php index a274b0b..e880411 100644 --- a/tests/php/Unit/PreviewTest.php +++ b/tests/php/Unit/PreviewTest.php @@ -68,7 +68,12 @@ final class PreviewTest extends TestCase $pdf = new Imagick(); foreach ([[400, 200, 'red'], [200, 400, 'blue']] as [$width, $height, $color]) { $page = new Imagick(); - $page->newImage($width, $height, $color, 'pdf'); + $page->newImage($width, $height, 'transparent', 'pdf'); + $drawing = new ImagickDraw(); + $drawing->setFillColor($color); + $drawing->rectangle($width * 0.15, $height * 0.2, $width * 0.75, $height * 0.8); + $page->drawImage($drawing); + $drawing->clear(); $pdf->addImage($page); $page->clear(); } @@ -89,6 +94,14 @@ final class PreviewTest extends TestCase $color = $image->getImagePixelColor(20, 20)->getColor(); self::assertGreaterThan(200, $color['r']); self::assertLessThan(30, $color['b']); + $paper = $image->getImagePixelColor(5, 5)->getColor(); + self::assertGreaterThan(245, $paper['r']); + self::assertGreaterThan(245, $paper['g']); + self::assertGreaterThan(245, $paper['b']); + self::assertSame(1.0, $image->getImagePixelColor(5, 5)->getColorValue(Imagick::COLOR_ALPHA)); + $edge = $image->getImagePixelColor(0, 25)->getColor(); + self::assertLessThan(230, $edge['r']); + self::assertGreaterThan(130, $edge['r']); $image->clear(); }