Completed
Push — master ( bdc37e...5a8dc8 )
by Daniel
10s
created

Ghostscript::getVersion()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 15
ccs 5
cts 5
cp 1
rs 9.4285
cc 3
eloc 8
nc 3
nop 0
crap 3
1
<?php
2
/**
3
 * This file is part of the Ghostscript package
4
 *
5
 * @author Daniel Schröder <[email protected]>
6
 */
7
8
namespace GravityMedia\Ghostscript;
9
10
use GravityMedia\Ghostscript\Device\BoundingBoxInfo;
11
use GravityMedia\Ghostscript\Device\NoDisplay;
12
use GravityMedia\Ghostscript\Device\PdfInfo;
13
use GravityMedia\Ghostscript\Device\PdfWrite;
14
use GravityMedia\Ghostscript\Process\Arguments as ProcessArguments;
15
use Symfony\Component\Process\ProcessBuilder;
16
17
/**
18
 * The Ghostscript class
19
 *
20
 * @package GravityMedia\Ghostscript
21
 */
22
class Ghostscript
23
{
24
    /**
25
     * The default binary
26
     */
27
    const DEFAULT_BINARY = 'gs';
28
29
    /**
30
     * The options
31
     *
32
     * @var array
33
     */
34
    protected $options;
35
36
    /**
37
     * The version
38
     *
39
     * @var string
40
     */
41
    protected $version;
42
43
    /**
44
     * Create Ghostscript object
45
     *
46
     * @param array $options
47 27
     *
48
     * @throws \RuntimeException
49 27
     */
50
    public function __construct(array $options = [])
51 27
    {
52 3
        $this->options = $options;
53
54 21
        if (version_compare('9.00', $this->getVersion()) > 0) {
55
            throw new \RuntimeException('Ghostscript version 9.00 or higher is required');
56
        }
57
    }
58
59
    /**
60
     * Get option
61
     *
62
     * @param string $name
63
     * @param mixed  $default
64 24
     *
65
     * @return mixed
66 24
     */
67 6
    public function getOption($name, $default = null)
68
    {
69
        if (array_key_exists($name, $this->options)) {
70 24
            return $this->options[$name];
71
        }
72
73
        return $default;
74
    }
75
76
    /**
77
     * Create process builder object
78
     *
79
     * @param array $arguments
80 24
     *
81
     * @return ProcessBuilder
82 24
     */
83 24
    protected function createProcessBuilder(array $arguments = [])
84 24
    {
85
        $processBuilder = new ProcessBuilder($arguments);
86 24
        $processBuilder->setPrefix($this->getOption('bin', self::DEFAULT_BINARY));
87
        $processBuilder->addEnvironmentVariables($this->getOption('env', []));
88
        if (($timeout = $this->getOption('timeout', -1)) != -1) {
89
            $processBuilder->setTimeout($timeout);
90
        }
91
92
        return $processBuilder;
93
    }
94
95
    /**
96 24
     * Get version
97
     *
98 24
     * @throws \RuntimeException
99 24
     *
100 24
     * @return string
101
     */
102 24
    public function getVersion()
103 3
    {
104
        if (null === $this->version) {
105
            $process = $this->createProcessBuilder(['--version'])->getProcess();
106 21
            $process->run();
107 21
108
            if (!$process->isSuccessful()) {
109 21
                throw new \RuntimeException($process->getErrorOutput());
110
            }
111
112
            $this->version = $process->getOutput();
113
        }
114
115
        return $this->version;
116
    }
117
118
    /**
119 6
     * Create process arguments object
120
     *
121 6
     * @param array $arguments
122 6
     *
123
     * @return ProcessArguments
124 6
     */
125 6
    protected function createProcessArguments(array $arguments = [])
126 6
    {
127
        $processArguments = new ProcessArguments();
128 6
        $processArguments->addArguments($arguments);
129
130
        if ($this->getOption('quiet', true)) {
131
            $processArguments->addArgument('-q');
132
        }
133
134
        return $processArguments;
135
    }
136
137
    /**
138 3
     * Create PDF device object
139
     *
140 3
     * @param null|string $outputFile
141 3
     *
142 3
     * @return PdfWrite
143 3
     */
144
    public function createPdfDevice($outputFile = null)
145 3
    {
146
        $builder = $this->createProcessBuilder();
147 3
        $arguments = $this->createProcessArguments();
148
149 3
        $device = new PdfWrite($builder, $arguments);
150 3
        $device
151 3
            ->setSafer()
152
            ->setBatch()
153 3
            ->setNoPause();
154
155
        if (null !== $outputFile) {
156
            $device->setOutputFile($outputFile);
157
        }
158
159
        return $device;
160
    }
161
162
    /**
163
     * Create null device object
164
     *
165
     * @return NoDisplay
166
     */
167
    public function createNullDevice()
168
    {
169
        $builder = $this->createProcessBuilder();
170
        $arguments = $this->createProcessArguments();
171
172
        return new NoDisplay($builder, $arguments);
173
    }
174
175
    /**
176
     * Create PDF info device object
177
     *
178
     * @param string $pdfInfoPath Path to toolbin/pdf_info.ps 
179
     * @return PdfInfo
180
     */
181
    public function createPdfInfoDevice($pdfInfoPath)
182
    {
183
        $builder = $this->createProcessBuilder();
184
        $arguments = $this->createProcessArguments();
185
186
        return new PdfInfo($builder, $arguments, $pdfInfoPath);
187
    }
188
189
    /**
190
     * Create bounding box info device object
191
     *
192
     * @return BoundingBoxInfo
193
     */
194
    public function createBboxDevice()
195
    {
196
        $builder = $this->createProcessBuilder();
197
        $arguments = $this->createProcessArguments();
198
199
        $device = new BoundingBoxInfo($builder, $arguments);
200
        $device
201
            ->setSafer()
202
            ->setBatch()
203
            ->setNoPause();
204
205
        return $device;
206
    }
207
}
208