67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Pdf;
 | 
						|
 | 
						|
use Illuminate\Contracts\Support\Responsable;
 | 
						|
use Illuminate\Support\Str;
 | 
						|
use Storage;
 | 
						|
 | 
						|
class PdfGenerator implements Responsable
 | 
						|
{
 | 
						|
 | 
						|
    private ?string $filename = null;
 | 
						|
    private PdfRepository $repo;
 | 
						|
    private string $dir;
 | 
						|
 | 
						|
    public function setRepository(PdfRepository $repo): self
 | 
						|
    {
 | 
						|
        $this->repo = $repo;
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function render(): self
 | 
						|
    {
 | 
						|
        $this->filename = $this->repo->getFilename();
 | 
						|
        $this->dir = Str::random(32);
 | 
						|
 | 
						|
        Storage::disk('temp')->put($this->dir.'/'.$this->repo->getFilename().'.tex', $this->compileView());
 | 
						|
        Storage::disk('temp')->makeDirectory($this->dir);
 | 
						|
 | 
						|
        $this->copyTemplateTo(Storage::disk('temp')->path($this->dir));
 | 
						|
 | 
						|
        $command = 'cd '.Storage::disk('temp')->path($this->dir);
 | 
						|
        $command .= ' && '.env('XELATEX').' --halt-on-error '.$this->repo->getFilename().'.tex';
 | 
						|
        exec($command, $output, $returnVar);
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function compileView(): string
 | 
						|
    {
 | 
						|
        return view()->make($this->repo->getView(), [
 | 
						|
            'data' => $this->repo,
 | 
						|
        ])->render();
 | 
						|
    }
 | 
						|
 | 
						|
    public function toResponse($request)
 | 
						|
    {
 | 
						|
        return response()->file($this->getCompiledFilename(), [
 | 
						|
            'Content-Type' => 'application/pdf',
 | 
						|
            'Content-Disposition' => "inline; filename=\"{$this->filename}.pdf\"",
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getCompiledFilename(): string
 | 
						|
    {
 | 
						|
        return Storage::disk('temp')->path($this->dir.'/'.$this->filename.'.pdf');
 | 
						|
    }
 | 
						|
 | 
						|
    private function copyTemplateTo(string $destination): void
 | 
						|
    {
 | 
						|
        $templatePath = resource_path("views/tex/templates/{$this->repo->getTemplate()}");
 | 
						|
        exec('cp '.$templatePath.'/* '.$destination);
 | 
						|
    }
 | 
						|
 | 
						|
}
 |