Completed
Push — master ( 4effa7...a58688 )
by Ben
03:21
created

ObjectWriter::getCurrentOffset()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
/**
3
 * BaconPdf
4
 *
5
 * @link      http://github.com/Bacon/BaconPdf For the canonical source repository
6
 * @copyright 2015 Ben Scholzen (DASPRiD)
7
 * @license   http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
8
 */
9
10
namespace Bacon\Pdf\Writer;
11
12
use Bacon\Pdf\Exception\InvalidArgumentException;
13
use SplFileObject;
14
15
/**
16
 * Writer responsible for writing objects to a stream.
17
 *
18
 * While the PDF specification tells that there is a line limit of 255 characters, not even Adobe's own PDF library
19
 * respects this limit. We ignore it as well, as it imposes a huge impact on the performance of the writer.
20
 *
21
 * @internal This is a very performance sensitive class, which is why some code may look duplicated. Before thinking
22
 *           about refactoring these parts, take a good look and the supplied benchmarks and verify that your changes
23
 *           do not affect the performance in a bad way. Keep in mind that the methods in this writer are called quite
24
 *           often.
25
 */
26
class ObjectWriter
27
{
28
    /**
29
     * @var SplFileObject
30
     */
31
    private $fileObject;
32
33
    /**
34
     * @var bool
35
     */
36
    private $requiresWhitespace = false;
37
38
    /**
39
     * @param SplFileObject $fileObject
40
     */
41
    public function __construct(SplFileObject $fileObject)
42
    {
43
        $this->fileObject = $fileObject;
44
    }
45
46
    /**
47
     * Returns the current position in the file.
48
     *
49
     * @return int
50
     */
51
    public function getCurrentOffset()
52
    {
53
        return $this->fileObject->ftell();
54
    }
55
56
    /**
57
     * Writes a raw data line to the stream.
58
     *
59
     * A newline character is appended after the data. Keep in mind that you may still be after a token which requires
60
     * a following whitespace, depending on the context you are in.
61
     *
62
     * @param string $data
63
     */
64
    public function writeRawLine($data)
65
    {
66
        $this->fileObject->fwrite($data . "\n");
67
    }
68
69
    /**
70
     * Starts a dictionary.
71
     */
72
    public function startDictionary()
73
    {
74
        $this->fileObject->fwrite('<<');
75
        $this->requiresWhitespace = false;
76
    }
77
78
    /**
79
     * Ends a dictionary.
80
     */
81
    public function endDictionary()
82
    {
83
        $this->fileObject->fwrite('>>');
84
        $this->requiresWhitespace = false;
85
    }
86
87
    /**
88
     * Starts an array.
89
     */
90
    public function startArray()
91
    {
92
        $this->fileObject->fwrite('[');
93
        $this->requiresWhitespace = false;
94
    }
95
96
    /**
97
     * Ends an array.
98
     */
99
    public function endArray()
100
    {
101
        $this->fileObject->fwrite(']');
102
        $this->requiresWhitespace = false;
103
    }
104
105
    /**
106
     * Writes a null value.
107
     */
108
    public function writeNull()
109
    {
110
        if ($this->requiresWhitespace) {
111
            $this->fileObject->fwrite(' null');
112
        } else {
113
            $this->fileObject->fwrite('null');
114
        }
115
116
        $this->requiresWhitespace = true;
117
    }
118
119
    /**
120
     * Writes a boolean.
121
     *
122
     * @param bool $boolean
123
     */
124
    public function writeBoolean($boolean)
125
    {
126
        if ($this->requiresWhitespace) {
127
            $this->fileObject->fwrite($boolean ? ' true' : ' false');
128
        } else {
129
            $this->fileObject->fwrite($boolean ? 'true' : 'false');
130
        }
131
132
        $this->requiresWhitespace = true;
133
    }
134
135
    /**
136
     * Writes a number.
137
     *
138
     * @param  int|float $number
139
     * @throws InvalidArgumentException
140
     */
141
    public function writeNumber($number)
142
    {
143
        if ($this->requiresWhitespace) {
144
            $this->fileObject->fwrite(rtrim(sprintf(' %.6F', $number), '0.'));
145
        } else {
146
            $this->fileObject->fwrite(rtrim(sprintf('%.6F', $number), '0.'));
147
        }
148
149
        $this->requiresWhitespace = true;
150
    }
151
152
    /**
153
     * Writes a name.
154
     *
155
     * @param string $name
156
     */
157
    public function writeName($name)
158
    {
159
        $this->fileObject->fwrite('/' . $name);
160
        $this->requiresWhitespace = true;
161
    }
162
163
    /**
164
     * Writes a literal string.
165
     *
166
     * The string itself is splitted into multiple lines after 248 characters. We chose that specific limit to avoid
167
     * splitting mutli-byte characters in half.
168
     *
169
     * @param string $string
170
     */
171
    public function writeLiteralString($string)
172
    {
173
        $this->fileObject->fwrite('(' . strtr($string, ['(' => '\\(', ')' => '\\)', '\\' => '\\\\']) . ')');
174
        $this->requiresWhitespace = false;
175
    }
176
177
    /**
178
     * Writes a hexadecimal string.
179
     *
180
     * @param string $string
181
     */
182
    public function writeHexadecimalString($string)
183
    {
184
        $this->fileObject->fwrite('<' . bin2hex($string) . '>');
185
        $this->requiresWhitespace = false;
186
    }
187
}
188