Passed
Push — master ( 69fb50...20d45d )
by Stephen
57s queued 11s
created

PdfExporter::download()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
namespace Sfneal\ViewExport\Pdf\Utils;
4
5
use Dompdf\Dompdf;
6
use Dompdf\Exception;
7
use Dompdf\Options;
8
use Illuminate\Contracts\View\View;
9
use Sfneal\Helpers\Aws\S3\S3;
10
use Sfneal\Helpers\Strings\StringHelpers;
11
12
class PdfExporter
13
{
14
    /**
15
     * @var Options
16
     */
17
    private $options;
18
19
    /**
20
     * @var Dompdf
21
     */
22
    private $pdf;
23
24
    /**
25
     * @var string|null AWS S3 file path
26
     */
27
    private $path;
28
29
    /**
30
     * @var string|null AWS S3 file URL
31
     */
32
    private $url;
33
34
    /**
35
     * @var string|null
36
     */
37
    private $output;
38
39
    /**
40
     * PdfExporter constructor.
41
     * @param View|string $content
42
     * @param Options|null $options
43
     * @throws Exception
44
     */
45
    public function __construct($content, Options $options = null)
46
    {
47
        // Declare PDF options
48
        $this->options = $this->setOptions($options);
49
50
        // Instantiate dompdf
51
        $this->pdf = new Dompdf($this->options);
52
53
        // Load content
54
        $this->loadContent($content);
55
56
        // Render the PDF
57
        $this->render();
58
    }
59
60
    /**
61
     * Upload a rendered PDF to an AWS S3 file store.
62
     *
63
     * @param string $path
64
     * @return $this
65
     */
66
    public function upload(string $path): self
67
    {
68
        $this->path = $path;
69
        $this->url = (new S3($path))->upload_raw($this->getOutput());
70
71
        return $this;
72
    }
73
74
    /**
75
     * View the PDF in the clients browser.
76
     *
77
     * @param string $filename
78
     */
79
    public function view(string $filename = 'output.pdf')
80
    {
81
        $this->pdf->stream($filename, ['Attachment' => false]);
82
    }
83
84
    /**
85
     * Download the PDF using the clients browser.
86
     *
87
     * @param string $filename
88
     */
89
    public function download(string $filename = 'output.pdf')
90
    {
91
        $this->pdf->stream($filename, ['Attachment' => true]);
92
    }
93
94
    /**
95
     * Retrieve the PDF's output.
96
     *
97
     * @return string
98
     */
99
    public function getOutput(): string
100
    {
101
        return $this->output;
102
    }
103
104
    /**
105
     * Retrieve the PDF's AWS S3 path.
106
     *
107
     * @return string|null
108
     */
109
    public function getPath(): ?string
110
    {
111
        return $this->path;
112
    }
113
114
    /**
115
     * Retrieve the PDF's AWS S3 url.
116
     *
117
     * @return string|null
118
     */
119
    public function getUrl(): ?string
120
    {
121
        return $this->url;
122
    }
123
124
    /**
125
     * Retrieve a Dompdf Options instance with custom values or defaults.
126
     *
127
     * @param Options|null $options
128
     * @return Options
129
     */
130
    private static function setOptions(Options $options = null): Options
131
    {
132
        // Default options if none provided
133
        if (! isset($options)) {
134
            $options = (new Options())
135
                ->setIsPhpEnabled(config('view-export.php_enabled'))
136
                ->setIsJavascriptEnabled(config('view-export.javascript_enabled'))
137
                ->setIsHtml5ParserEnabled(config('view-export.html5_parsable'))
138
                ->setIsRemoteEnabled(config('view-export.remote_enabled'));
139
        }
140
141
        // Set file permissions
142
        $options->setChroot(config('view-export.chroot'));
143
144
        // Return the options
145
        return $options;
146
    }
147
148
    /**
149
     * Load PDF content to the Dompdf instance.
150
     *
151
     *  - $content can be a View or HTML file contents
152
     *
153
     * @param View|string $content
154
     * @return $this
155
     * @throws Exception
156
     */
157
    private function loadContent($content): self
158
    {
159
        // Create local HTML file path
160
        $localHTML = StringHelpers::joinPaths($this->options->getRootDir(), uniqid().'.html');
161
162
        // Store View (or HTML) as HTML file within Dompdf root
163
        touch($localHTML);
164
        file_put_contents($localHTML, $content);
165
166
        // Load HTML
167
        $this->pdf->loadHtmlFile($localHTML);
168
169
        // Remove temp HTML file
170
        unlink($localHTML);
171
172
        return $this;
173
    }
174
175
    /**
176
     * Render a Dompdf & store it's output in a property.
177
     *
178
     *  - storing output in a property avoids potentially calling expensive 'output()' method multiple times
179
     *
180
     * @return void
181
     */
182
    private function render(): void
183
    {
184
        $this->pdf->render();
185
        $this->output = $this->pdf->output();
186
    }
187
}
188