PoDoFo 1.0.0-dev
Loading...
Searching...
No Matches
PdfArray.h
1
7#ifndef PDF_ARRAY_H
8#define PDF_ARRAY_H
9
10#include "PdfDeclarations.h"
11#include "PdfDataContainer.h"
12
13namespace PoDoFo {
14
15class PdfArray;
16using PdfArrayList = std::vector<PdfObject>;
17
21template <typename TObject, typename TListIterator>
22class PdfArrayIndirectIterableBase final : public PdfIndirectIterableBase
23{
24 friend class PdfArray;
25
26public:
28
29private:
31
32public:
33 class Iterator final
34 {
36 public:
37 using difference_type = void;
38 using value_type = TObject*;
39 using pointer = void;
40 using reference = void;
41 using iterator_category = std::forward_iterator_tag;
42 public:
43 Iterator();
44 private:
45 Iterator(TListIterator&& iterator, PdfIndirectObjectList* objects);
46 public:
47 Iterator(const Iterator&) = default;
48 Iterator& operator=(const Iterator&) = default;
49 bool operator==(const Iterator& rhs) const;
50 bool operator!=(const Iterator& rhs) const;
51 Iterator& operator++();
52 Iterator operator++(int);
53 value_type operator*();
54 value_type operator->();
55 private:
56 value_type resolve();
57 private:
58 TListIterator m_iterator;
59 PdfIndirectObjectList* m_objects;
60 };
61
62public:
63 Iterator begin() const;
64 Iterator end() const;
65
66private:
67 PdfArray* m_arr;
68};
69
72
80class PODOFO_API PdfArray final : public PdfDataContainer
81{
82 friend class PdfObject;
83 friend class PdfTokenizer;
84
85public:
86 using size_type = size_t;
87 using value_type = PdfObject;
88 using reference = value_type&;
89 using const_reference = const value_type&;
90 using iterator = PdfArrayList::iterator;
91 using const_iterator = PdfArrayList::const_iterator;
92 using reverse_iterator = PdfArrayList::reverse_iterator;
93 using const_reverse_iterator = PdfArrayList::const_reverse_iterator;
94
97 PdfArray();
98
103 PdfArray(const PdfArray& rhs);
104 PdfArray(PdfArray&& rhs) noexcept;
105
106 template <typename TReal, typename = std::enable_if_t<std::is_floating_point_v<TReal>>>
107 static PdfArray FromReals(cspan<TReal> reals);
108
109 template <typename TInt, typename = std::enable_if_t<std::is_integral_v<TInt>>>
110 static PdfArray FromNumbers(cspan<TInt> numbers);
111
112 static PdfArray FromBools(cspan<bool> bools);
113
118 PdfArray& operator=(const PdfArray& rhs);
119 PdfArray& operator=(PdfArray&& rhs) noexcept;
120
124 unsigned GetSize() const;
125
129 bool IsEmpty() const;
130
133 void Clear();
134
136 const PdfStatefulEncrypt* encrypt, charbuff& buffer) const override;
137
138 template <typename T>
139 T GetAtAs(unsigned idx) const;
140
141 template <typename T>
142 T GetAtAsSafe(unsigned idx, const std::common_type_t<T>& defvalue = { }) const;
143
144 template <typename T>
145 bool TryGetAtAs(unsigned idx, T& value) const;
146
156 const PdfObject* FindAt(unsigned idx) const;
157 PdfObject* FindAt(unsigned idx);
158
159 const PdfObject& MustFindAt(unsigned idx) const;
160 PdfObject& MustFindAt(unsigned idx);
161
162 template <typename T>
163 T FindAtAs(unsigned idx, const std::common_type_t<T>& defvalue = { }) const;
164
165 template <typename T>
166 T FindAtAsSafe(unsigned idx, const std::common_type_t<T>& defvalue = { }) const;
167
168 template <typename T>
169 bool TryFindAtAs(unsigned idx, T& value) const;
170
171 void RemoveAt(unsigned idx);
172
173 PdfObject& Add(const PdfObject& obj);
174
175 PdfObject& Add(PdfObject&& obj);
176
177 void AddIndirect(const PdfObject& obj);
178
179 PdfObject& AddIndirectSafe(const PdfObject& obj);
180
181 PdfObject& SetAt(unsigned idx, const PdfObject& obj);
182
183 PdfObject& SetAt(unsigned idx, PdfObject&& obj);
184
185 void SetAtIndirect(unsigned idx, const PdfObject* obj);
186
187 PdfObject& SetAtIndirectSafe(unsigned idx, const PdfObject& obj);
188
189 PdfArrayIndirectIterable GetIndirectIterator();
190
191 PdfArrayConstIndirectIterable GetIndirectIterator() const;
192
198 void Resize(unsigned count, const PdfObject& val = PdfObject());
199
200 void Reserve(unsigned n);
201
202 void SwapAt(unsigned atIndex, unsigned toIndex);
203
204 void MoveTo(unsigned atIndex, unsigned toIndex);
205
206public:
210 size_t size() const;
211
212 PdfObject& operator[](size_type idx);
213 const PdfObject& operator[](size_type idx) const;
214
220 iterator begin();
221
227 const_iterator begin() const;
228
234 iterator end();
235
241 const_iterator end() const;
242
248 reverse_iterator rbegin();
249
255 const_reverse_iterator rbegin() const;
256
262 reverse_iterator rend();
263
269 const_reverse_iterator rend() const;
270
271 void resize(size_t size);
272
273 void reserve(size_t size);
274
275 iterator insert(const iterator& pos, const PdfObject& obj);
276 iterator insert(const iterator& pos, PdfObject&& obj);
277
278 template<typename InputIterator>
279 inline void insert(const iterator& pos, const InputIterator& first, const InputIterator& last);
280
281 void erase(const iterator& pos);
282 void erase(const iterator& first, const iterator& last);
283
288 reference front();
289
294 const_reference front() const;
295
300 reference back();
301
306 const_reference back() const;
307
308public:
309 bool operator==(const PdfArray& rhs) const;
310 bool operator!=(const PdfArray& rhs) const;
311
312protected:
313 void resetDirty() override;
314 void setChildrenParent() override;
315
316private:
317 // Append a new "null" object to the back
318 PdfObject& EmplaceBackNoDirtySet();
319
320private:
321 PdfObject& add(PdfObject&& obj);
322 iterator insertAt(const iterator& pos, PdfObject&& obj);
323 PdfObject& getAt(unsigned idx) const;
324 PdfObject* findAt(unsigned idx) const;
326 const PdfStatefulEncrypt* encrypt, charbuff& buffer) const;
327
328private:
329 PdfArrayList m_Objects;
330};
331
332template<typename TReal, typename>
333PdfArray PdfArray::FromReals(cspan<TReal> reals)
334{
336 arr.reserve(reals.size());
337 for (unsigned i = 0; i < reals.size(); i++)
338 arr.Add(PdfObject(static_cast<double>(reals[i])));
339
340 return arr;
341}
342
343template<typename TInt, typename>
344PdfArray PdfArray::FromNumbers(cspan<TInt> numbers)
345{
346 PdfArray arr;
347 arr.reserve(numbers.size());
348 for (unsigned i = 0; i < numbers.size(); i++)
349 arr.Add(PdfObject(static_cast<int64_t>(numbers[i])));
350
351 return arr;
352}
353
354template<typename T>
355T PdfArray::GetAtAs(unsigned idx) const
356{
357 return Object<T>::Get(getAt(idx));
358}
359
360template<typename T>
361T PdfArray::GetAtAsSafe(unsigned idx, const std::common_type_t<T>& defvalue) const
362{
363 T value;
364 if (Object<T>::TryGet(getAt(idx), value))
365 return value;
366 else
367 return defvalue;
368}
369
370template<typename T>
371bool PdfArray::TryGetAtAs(unsigned idx, T& value) const
372{
373 if (Object<T>::TryGet(getAt(idx), value))
374 {
375 return true;
376 }
377 else
378 {
379 value = { };
380 return false;
381 }
382}
383
384template<typename T>
385T PdfArray::FindAtAs(unsigned idx, const std::common_type_t<T>& defvalue) const
386{
387 auto obj = findAt(idx);
388 if (obj == nullptr)
389 return defvalue;
390
391 return Object<T>::Get(*obj);
392}
393
394template<typename T>
395T PdfArray::FindAtAsSafe(unsigned idx, const std::common_type_t<T>& defvalue) const
396{
397 T value;
398 auto obj = findAt(idx);
399 if (obj != nullptr && Object<T>::TryGet(*obj, value))
400 return value;
401 else
402 return defvalue;
403}
404
405template<typename T>
406bool PdfArray::TryFindAtAs(unsigned idx, T& value) const
407{
408 auto obj = findAt(idx);
409 if (obj != nullptr && Object<T>::TryGet(*obj, value))
410 {
411 return true;
412 }
413 else
414 {
415 value = { };
416 return false;
417 }
418}
419
420template<typename InputIterator>
421void PdfArray::insert(const PdfArray::iterator& pos,
422 const InputIterator& first,
423 const InputIterator& last)
424{
425 AssertMutable();
426 auto document = GetObjectDocument();
427 InputIterator it1 = first;
428 iterator it2 = pos;
429 for (; it1 != last; it1++, it2++)
430 {
431 it2 = m_Objects.insert(it2, *it1);
432 it2->SetDocument(document);
433 }
434
435 SetDirty();
436}
437
438template<typename TObject, typename TListIterator>
439PdfArrayIndirectIterableBase<TObject, TListIterator>::PdfArrayIndirectIterableBase()
440 : m_arr(nullptr) { }
441
442template<typename TObject, typename TListIterator>
443PdfArrayIndirectIterableBase<TObject, TListIterator>::PdfArrayIndirectIterableBase(PdfArray& arr)
444 : PdfIndirectIterableBase(arr), m_arr(&arr) { }
445
446template<typename TObject, typename TListIterator>
447typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::begin() const
448{
449 if (m_arr == nullptr)
450 return Iterator();
451 else
452 return Iterator(m_arr->begin(), GetObjects());
453}
454
455template<typename TObject, typename TListIterator>
456typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::end() const
457{
458 if (m_arr == nullptr)
459 return Iterator();
460 else
461 return Iterator(m_arr->end(), GetObjects());
462}
463
464template<typename TObject, typename TListIterator>
465PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::Iterator() : m_objects(nullptr) { }
466
467template<typename TObject, typename TListIterator>
468PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::Iterator(TListIterator&& iterator, PdfIndirectObjectList* objects)
469 : m_iterator(std::move(iterator)), m_objects(objects) { }
470
471template<typename TObject, typename TListIterator>
472bool PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator==(const Iterator& rhs) const
473{
474 return m_iterator == rhs.m_iterator;
475}
476
477template<typename TObject, typename TListIterator>
478bool PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator!=(const Iterator& rhs) const
479{
480 return m_iterator != rhs.m_iterator;
481}
482
483template<typename TObject, typename TListIterator>
484typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator& PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator++()
485{
486 m_iterator++;
487 return *this;
488}
489
490template<typename TObject, typename TListIterator>
491typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator++(int)
492{
493 auto copy = *this;
494 m_iterator++;
495 return copy;
496}
497
498template<typename TObject, typename TListIterator>
499typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator*()
500{
501 return resolve();
502}
503
504template<typename TObject, typename TListIterator>
505typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator->()
506{
507 return resolve();
508}
509
510template<typename TObject, typename TListIterator>
511typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::resolve()
512{
513 TObject& robj = *m_iterator;
514 TObject* indirectobj;
515 PdfReference ref;
516 if (m_objects != nullptr
517 && robj.TryGetReference(ref)
518 && ref.IsIndirect()
519 && (indirectobj = GetObject(*m_objects, ref)) != nullptr)
520 {
521 return indirectobj;
522 }
523 else
524 {
525 return &robj;
526 }
527}
528
529};
530
531#endif // PDF_ARRAY_H
SPDX-FileCopyrightText: (C) 2005 Dominik Seichter domseichter@web.de SPDX-FileCopyrightText: (C) 2020...
An interface for writing blocks of data to a data source.
Definition OutputStream.h:18
Helper class to iterate through array indirect objects.
Definition PdfArray.h:23
This class represents a PdfArray Use it for all arrays that are written to a PDF file.
Definition PdfArray.h:81
PdfArray()
Create an empty array.
Definition PdfArray.cpp:15
A PdfDataProvider object with a PdfObject owner, specialized in holding objects.
Definition PdfDataContainer.h:22
A list of PdfObjects that constitutes the indirect object list of the document The PdfParser will rea...
Definition PdfIndirectObjectList.h:30
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:35
A simple tokenizer for PDF files and PDF content streams.
Definition PdfTokenizer.h:36
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:38
SPDX-FileCopyrightText: (C) 2022 Francesco Pretto ceztko@gmail.com SPDX-License-Identifier: LGPL-2....
Definition basetypes.h:16
PdfWriteFlags
Specify additional options for writing the PDF.
Definition PdfDeclarations.h:149