Fixed: Resize PDF only once
This commit is contained in:
parent
6b0ab3182c
commit
6daae8e9a3
|
@ -35,7 +35,9 @@ class ImageResizer
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->file->compressor()->shouldGenerateVersions()) {
|
if ($this->file->compressor()->shouldGenerateVersions()) {
|
||||||
|
$this->file->compressor()->start();
|
||||||
$this->generateVersions();
|
$this->generateVersions();
|
||||||
|
$this->file->compressor()->end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +91,7 @@ class ImageResizer
|
||||||
private function generateVersions(): void
|
private function generateVersions(): void
|
||||||
{
|
{
|
||||||
foreach ($this->possibleSizes() as $size) {
|
foreach ($this->possibleSizes() as $size) {
|
||||||
$this->file->compressor()->resize($this->file->root(), $this->file->versionsDirPath(), $size);
|
$this->file->compressor()->resize($size);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->file->versions() as $version) {
|
foreach ($this->file->versions() as $version) {
|
||||||
|
|
|
@ -8,7 +8,7 @@ use Storage;
|
||||||
abstract class Compressor
|
abstract class Compressor
|
||||||
{
|
{
|
||||||
|
|
||||||
protected $media;
|
protected MediaPath $media;
|
||||||
|
|
||||||
abstract function make(string $path): array;
|
abstract function make(string $path): array;
|
||||||
|
|
||||||
|
@ -26,9 +26,9 @@ abstract class Compressor
|
||||||
return "/tmp/".str_slug(microtime());
|
return "/tmp/".str_slug(microtime());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function versionFilename(string $source, $width, $height): string
|
protected function versionFilename($width, $height): string
|
||||||
{
|
{
|
||||||
return pathinfo($source, PATHINFO_FILENAME).
|
return $this->media->filename().
|
||||||
'-'.
|
'-'.
|
||||||
$width.
|
$width.
|
||||||
'x'.
|
'x'.
|
||||||
|
|
|
@ -41,20 +41,30 @@ class JpgCompressor extends Compressor {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resize(string $source, string $destination, Collection $size): void
|
public function resize(Collection $size): void
|
||||||
{
|
{
|
||||||
$extension = pathinfo($source, PATHINFO_EXTENSION);
|
$extension = $this->media->extension();
|
||||||
$temp = microtime().'.'.$extension;
|
$temp = microtime().'.'.$extension;
|
||||||
|
|
||||||
$r = app(ImageManager::class)->make($source)
|
$r = app(ImageManager::class)->make($this->media->root())
|
||||||
->fit($size->get('width'), $size->get('height'), fn ($constraint) => $constraint->upsize())
|
->fit($size->get('width'), $size->get('height'), fn ($constraint) => $constraint->upsize())
|
||||||
->save(Storage::path($temp));
|
->save(Storage::path($temp));
|
||||||
|
|
||||||
list($destWidth, $destHeight) = getimagesize(Storage::path($temp));
|
list($destWidth, $destHeight) = getimagesize(Storage::path($temp));
|
||||||
|
|
||||||
$versionFilename = $destination.'/'.$this->versionFilename($source, $destWidth, $destHeight);
|
$versionFilename = $this->media->versionsDirPath().'/'.$this->versionFilename($destWidth, $destHeight);
|
||||||
|
|
||||||
$this->moveTo($temp, $versionFilename);
|
$this->moveTo($temp, $versionFilename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function start(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function end(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,14 +33,31 @@ class PdfCompressor extends Compressor
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function extractImage(string $pdf): string
|
private function imagePath(): string
|
||||||
{
|
{
|
||||||
$file = $this->tmpPath().'.'.$this->getExtension();
|
return '/tmp/'.str_slug($this->media->root()).'.jpg';
|
||||||
|
}
|
||||||
|
|
||||||
exec('convert -density 150 '.escapeshellarg($pdf.'[0]').' -quality 90 '.escapeshellarg($file), $output, $r);
|
public function start(): void
|
||||||
|
{
|
||||||
|
@unlink($this->imagePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function end(): void
|
||||||
|
{
|
||||||
|
@unlink($this->imagePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
private function extractImage(): string
|
||||||
|
{
|
||||||
|
$file = $this->imagePath();
|
||||||
|
|
||||||
if (!file_exists($file)) {
|
if (!file_exists($file)) {
|
||||||
throw new ResizerException('File cannot be generated from PDF file. Root file is "'.$pdf.'"');
|
exec('convert -density 150 '.escapeshellarg($this->media->root().'[0]').' -quality 90 '.escapeshellarg($file), $output, $r);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!file_exists($file)) {
|
||||||
|
throw new ResizerException('File cannot be generated from PDF file. Root file is "'.$this->media->root().'"');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $file;
|
return $file;
|
||||||
|
@ -50,7 +67,6 @@ class PdfCompressor extends Compressor
|
||||||
{
|
{
|
||||||
$filename = $this->extractImage($this->media->root());
|
$filename = $this->extractImage($this->media->root());
|
||||||
$size = getimagesize($filename);
|
$size = getimagesize($filename);
|
||||||
unlink($filename);
|
|
||||||
|
|
||||||
return $size;
|
return $size;
|
||||||
}
|
}
|
||||||
|
@ -60,20 +76,20 @@ class PdfCompressor extends Compressor
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resize(string $source, string $destination, Collection $size): void
|
public function resize(Collection $size): void
|
||||||
{
|
{
|
||||||
$temp = $this->extractImage($source);
|
$temp = $this->extractImage();
|
||||||
|
$tempBefore = PATHINFO($temp, PATHINFO_FILENAME).'compiled.'.pathinfo($temp, PATHINFO_EXTENSION);
|
||||||
|
|
||||||
$r = app(ImageManager::class)->make($temp)
|
$r = app(ImageManager::class)->make($temp)
|
||||||
->fit($size->get('width'), $size->get('height'), fn ($constraint) => $constraint->upsize())
|
->fit($size->get('width'), $size->get('height'))
|
||||||
->save($temp);
|
->save($tempBefore);
|
||||||
|
|
||||||
list($destWidth, $destHeight) = getimagesize($temp);
|
list($destWidth, $destHeight) = getimagesize($tempBefore);
|
||||||
$versionFilename = $destination.'/'.$this->versionFilename($source, $destWidth, $destHeight);
|
$versionFilename = $this->media->versionsDirPath().'/'.$this->versionFilename($destWidth, $destHeight);
|
||||||
|
|
||||||
Storage::put($versionFilename, file_get_contents($temp));
|
Storage::put($versionFilename, file_get_contents($tempBefore));
|
||||||
|
unlink($tempBefore);
|
||||||
unlink($temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,19 +41,29 @@ class PngCompressor extends Compressor {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resize(string $source, string $destination, Collection $size): void
|
public function start(): void
|
||||||
{
|
{
|
||||||
$extension = pathinfo($source, PATHINFO_EXTENSION);
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function end(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resize(Collection $size): void
|
||||||
|
{
|
||||||
|
$extension = $this->media->extension();
|
||||||
$temp = microtime().'.'.$extension;
|
$temp = microtime().'.'.$extension;
|
||||||
|
|
||||||
$r = app(ImageManager::class)->make($source);
|
$r = app(ImageManager::class)->make($this->media->root());
|
||||||
app(ImageManager::class)
|
app(ImageManager::class)
|
||||||
->canvas($size->get('width'), $size->get('height'))->insert($r, 'center')
|
->canvas($size->get('width'), $size->get('height'))->insert($r, 'center')
|
||||||
->save(Storage::path($temp));
|
->save(Storage::path($temp));
|
||||||
|
|
||||||
list($destWidth, $destHeight) = getimagesize(Storage::path($temp));
|
list($destWidth, $destHeight) = getimagesize(Storage::path($temp));
|
||||||
|
|
||||||
$versionFilename = $destination.'/'.$this->versionFilename($source, $destWidth, $destHeight);
|
$versionFilename = $this->media->versionsDirPath().'/'.$this->versionFilename($destWidth, $destHeight);
|
||||||
|
|
||||||
$this->moveTo($temp, $versionFilename);
|
$this->moveTo($temp, $versionFilename);
|
||||||
}
|
}
|
||||||
|
|
|
@ -234,10 +234,10 @@ class ResizerTest extends TestCase
|
||||||
$this->media->put('/pages/test.pdf', file_get_contents(__DIR__.'/stub/dummy.pdf'));
|
$this->media->put('/pages/test.pdf', file_get_contents(__DIR__.'/stub/dummy.pdf'));
|
||||||
Event::fire('media.file.upload', [null, '/pages/test.pdf', null]);
|
Event::fire('media.file.upload', [null, '/pages/test.pdf', null]);
|
||||||
|
|
||||||
$this->assertHasFile('pages/test-1275x1650.pdf.jpg');
|
|
||||||
$this->assertHasFile('pages/test-1275x1275.pdf.jpg');
|
|
||||||
$this->assertHasFile('pages/test-200x259.pdf.jpg');
|
$this->assertHasFile('pages/test-200x259.pdf.jpg');
|
||||||
$this->assertHasFile('pages/test-200x200.pdf.jpg');
|
$this->assertHasFile('pages/test-200x200.pdf.jpg');
|
||||||
|
$this->assertHasFile('pages/test-1275x1275.pdf.jpg');
|
||||||
|
$this->assertHasFile('pages/test-1275x1650.pdf.jpg');
|
||||||
$this->assertFileCount(4, 'pages');
|
$this->assertFileCount(4, 'pages');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue