10#include "PdfVariant.h"
11#include "PdfObjectStream.h"
16class PdfIndirectObjectList;
20class PdfDataContainer;
41 friend class PdfObjectOutputStream;
43 friend class PdfDictionaryElement;
44 friend class PdfArrayElement;
48 PODOFO_PRIVATE_FRIEND(
class PdfParser);
52 PODOFO_PRIVATE_FRIEND(
class PdfXRef);
143 std::string_view GetDataTypeString()
const;
151 bool IsNumber()
const;
157 bool IsRealStrict()
const;
161 bool IsNumberOrReal()
const;
165 bool IsString()
const;
173 bool IsArray()
const;
177 bool IsDictionary()
const;
181 bool IsRawData()
const;
189 bool IsReference()
const;
201 bool GetBool()
const;
202 bool TryGetBool(
bool& value)
const;
209 int64_t GetNumberLenient()
const;
210 bool TryGetNumberLenient(
int64_t& value)
const;
218 bool TryGetNumber(
int64_t& value)
const;
225 double GetReal()
const;
226 bool TryGetReal(
double& value)
const;
233 double GetRealStrict()
const;
234 bool TryGetRealStrict(
double& value)
const;
244 const PdfName& GetName()
const;
278 void SetBool(
bool b);
294 void SetReal(
double d);
314 void ForceCreateStream();
355 virtual bool TryUnload();
362 bool HasStream()
const;
364 bool IsIndirect()
const;
416 inline bool IsDirty()
const {
return m_IsDirty; }
442 inline bool IsDelayedLoadStreamDone()
const {
return m_IsDelayedLoadStreamDone; }
444 const PdfObjectStream* GetStream()
const;
445 PdfObjectStream* GetStream();
448 PdfObject(PdfVariant&& var,
const PdfReference& indirectReference,
bool isDirty);
450 PdfObject(PdfArray* arr);
461 void DelayedLoad()
const;
477 virtual void delayedLoad();
479 virtual void delayedLoadStream();
484 virtual bool removeStream();
486 virtual bool HasStreamToParse()
const;
501 void SetDocument(PdfDocument* document);
503 void SetVariantOwner();
507 PdfObjectStream& getOrCreateStream();
509 void forceCreateStream();
511 PdfObjectStream* getStream();
513 void DelayedLoadStream()
const;
515 void EnableDelayedLoadingStream();
517 void MakeDelayedLoadingStreamDone();
519 inline void SetIndirectReference(
const PdfReference& reference) { m_IndirectReference = reference; }
529 void EnableDelayedLoading();
534 virtual void SetRevised();
538 PdfVariant& GetVariantUnsafe() {
return m_Variant; }
539 PdfReference GetReferenceUnsafe()
const {
return m_Variant.GetReferenceUnsafe(); }
540 const PdfDictionary& GetDictionaryUnsafe()
const {
return m_Variant.GetDictionaryUnsafe(); }
541 const PdfArray& GetArrayUnsafe()
const {
return m_Variant.GetArrayUnsafe(); }
542 PdfDictionary& GetDictionaryUnsafe() {
return m_Variant.GetDictionaryUnsafe(); }
543 PdfArray& GetArrayUnsafe() {
return m_Variant.GetArrayUnsafe(); }
544 void WriteFinal(OutputStream& stream, PdfWriteFlags writeMode,
545 const PdfStatefulEncrypt* encrypt, charbuff& buffer);
548 void SetNumberNoDirtySet(int64_t l);
552 void WriteHeader(OutputStream& stream, PdfWriteFlags writeMode, charbuff& buffer)
const;
555 bool IsImmutable()
const {
return m_IsImmutable; }
558 void AssignNoDirtySet(PdfObject&& rhs);
559 void AssignNoDirtySet(PdfVariant&& rhs);
560 void AssignNoDirtySet(
const PdfObject& rhs);
562 void SetParent(PdfDataContainer& parent);
565 void write(OutputStream& stream,
bool skipLengthFix,
566 PdfWriteFlags writeMode,
const PdfStatefulEncrypt* encrypt, charbuff& buffer)
const;
568 void assertMutable()
const;
570 void assign(
const PdfObject& rhs);
572 void moveFrom(PdfObject&& rhs);
582 PdfObject(T*) =
delete;
584 void copyStreamFrom(
const PdfObject& obj);
590 PdfVariant m_Variant;
593 PdfReference m_IndirectReference;
594 PdfDocument* m_Document;
595 PdfDataContainer* m_Parent;
596 std::unique_ptr<PdfObjectStream> m_Stream;
599 mutable bool m_IsDelayedLoadDone;
600 mutable bool m_IsDelayedLoadStreamDone;
607 template <
typename T>
643 return obj.GetBool();
646 static bool Get(
const PdfObject& obj,
bool fallback)
649 if (obj.TryGetBool(ret))
655 static bool TryGet(
const PdfObject& obj,
bool& value)
657 return obj.TryGetBool(value);
662 struct ObjectAdapter<int64_t>
664 using TRet = int64_t;
666 static int64_t Get(
const PdfObject& obj)
668 return obj.GetNumber();
671 static int64_t Get(
const PdfObject& obj, int64_t fallback)
674 if (obj.TryGetNumber(ret))
680 static bool TryGet(
const PdfObject& obj, int64_t& value)
682 return obj.TryGetNumber(value);
687 struct ObjectAdapter<double>
691 static double Get(
const PdfObject& obj)
693 return obj.GetReal();
696 static double Get(
const PdfObject& obj,
double fallback)
699 if (obj.TryGetReal(ret))
705 static bool TryGet(
const PdfObject& obj,
double& value)
707 return obj.TryGetReal(value);
712 struct ObjectAdapter<PdfReference>
714 using TRet = PdfReference;
716 static PdfReference Get(
const PdfObject& obj)
718 return obj.GetReference();
721 static PdfReference Get(
const PdfObject& obj,
const PdfReference& fallback)
724 if (obj.TryGetReference(ret))
730 static bool TryGet(
const PdfObject& obj, PdfReference& value)
732 return obj.TryGetReference(value);
737 struct ObjectAdapter<PdfName>
739 using TRet =
const PdfName&;
741 static const PdfName& Get(
const PdfObject& obj)
743 return obj.GetName();
746 static const PdfName& Get(
const PdfObject& obj,
const PdfName& fallback)
749 if (obj.TryGetName(ret))
755 static bool TryGet(
const PdfObject& obj, PdfName& value)
757 return obj.TryGetName(value);
762 struct ObjectAdapter<const PdfName*>
764 using TRet =
const PdfName*;
766 static const PdfName* Get(
const PdfObject& obj)
769 (void)obj.TryGetName(ret);
773 static const PdfName* Get(
const PdfObject& obj,
const PdfName* fallback)
776 if (obj.TryGetName(ret))
782 static bool TryGet(
const PdfObject& obj,
const PdfName*& value)
784 return obj.TryGetName(value);
789 struct ObjectAdapter<PdfString>
791 using TRet =
const PdfString&;
793 static const PdfString& Get(
const PdfObject& obj)
795 return obj.GetString();
798 static const PdfString& Get(
const PdfObject& obj,
const PdfString& fallback)
800 const PdfString* ret;
801 if (obj.TryGetString(ret))
807 static bool TryGet(
const PdfObject& obj, PdfString& value)
809 return obj.TryGetString(value);
814 struct ObjectAdapter<const PdfString*>
816 using TRet =
const PdfString*;
818 static const PdfString* Get(PdfObject& obj)
820 const PdfString* ret;
821 (void)obj.TryGetString(ret);
825 static const PdfString* Get(
const PdfObject& obj,
const PdfString* fallback)
827 const PdfString* ret;
828 if (obj.TryGetString(ret))
834 static bool TryGet(
const PdfObject& obj,
const PdfString*& value)
836 return obj.TryGetString(value);
841 struct ObjectAdapter<PdfDictionary*>
843 using TRet = PdfDictionary*;
845 static PdfDictionary* Get(PdfObject& obj)
848 (void)obj.TryGetDictionary(ret);
852 static PdfDictionary* Get(PdfObject& obj, PdfDictionary* fallback)
855 if (obj.TryGetDictionary(ret))
861 static bool TryGet(PdfObject& obj, PdfDictionary*& value)
863 return obj.TryGetDictionary(value);
868 struct ObjectAdapter<const PdfDictionary*>
870 using TRet =
const PdfDictionary*;
872 static const PdfDictionary* Get(
const PdfObject& obj)
874 const PdfDictionary* ret;
875 (void)obj.TryGetDictionary(ret);
879 static const PdfDictionary* Get(
const PdfObject& obj,
const PdfDictionary* fallback)
881 const PdfDictionary* ret;
882 if (obj.TryGetDictionary(ret))
888 static bool TryGet(
const PdfObject& obj,
const PdfDictionary*& value)
890 return obj.TryGetDictionary(value);
895 struct ObjectAdapter<PdfDictionary>
897 using TRet = PdfDictionary&;
899 static PdfDictionary& Get(PdfObject& obj)
901 return obj.GetDictionary();
904 static PdfDictionary& Get(PdfObject& obj, PdfDictionary& fallback)
907 if (obj.TryGetDictionary(ret))
913 static bool TryGet(
const PdfObject& obj, PdfDictionary& value)
915 return obj.TryGetDictionary(value);
920 struct ObjectAdapter<PdfArray*>
922 using TRet = PdfArray*;
924 static PdfArray* Get(PdfObject& obj)
927 (void)obj.TryGetArray(ret);
931 static PdfArray* Get(PdfObject& obj, PdfArray* fallback)
934 if (obj.TryGetArray(ret))
940 static bool TryGet(PdfObject& obj, PdfArray*& value)
942 return obj.TryGetArray(value);
947 struct ObjectAdapter<const PdfArray*>
949 using TRet =
const PdfArray*;
951 static const PdfArray* Get(
const PdfObject& obj)
954 (void)obj.TryGetArray(ret);
958 static const PdfArray* Get(PdfObject& obj,
const PdfArray* fallback)
961 if (obj.TryGetArray(ret))
967 static bool TryGet(
const PdfObject& obj,
const PdfArray*& value)
969 return obj.TryGetArray(value);
974 struct ObjectAdapter<PdfArray>
976 using TRet = PdfArray&;
978 static PdfArray& Get(PdfObject& obj)
980 return obj.GetArray();
983 static PdfArray& Get(PdfObject& obj, PdfArray& fallback)
986 if (obj.TryGetArray(ret))
992 static bool TryGet(
const PdfObject& obj, PdfArray& value)
994 return obj.TryGetArray(value);
1001 struct PODOFO_API PdfObjectInequality final
1003 using is_transparent = std::true_type;
1005 bool operator()(
const PdfObject* lhs,
const PdfObject* rhs)
const
1007 return lhs->GetIndirectReference() < rhs->GetIndirectReference();
1009 bool operator()(
const PdfObject* lhs,
const PdfReference& rhs)
const
1011 return lhs->GetIndirectReference() < rhs;
1013 bool operator()(
const PdfReference& lhs,
const PdfObject* rhs)
const
1015 return lhs < rhs->GetIndirectReference();
1017 bool operator()(
const PdfObject& lhs,
const PdfObject& rhs)
const
1019 return lhs.GetIndirectReference() < rhs.GetIndirectReference();
1021 bool operator()(
const PdfObject& lhs,
const PdfReference& rhs)
const
1023 return lhs.GetIndirectReference() < rhs;
1025 bool operator()(
const PdfReference& lhs,
const PdfObject& rhs)
const
1027 return lhs < rhs.GetIndirectReference();
An interface for writing blocks of data to a data source.
Definition OutputStream.h:18
This class represents a PdfArray Use it for all arrays that are written to a PDF file.
Definition PdfArray.h:81
A PdfDataProvider object with a PdfObject owner, specialized in holding objects.
Definition PdfDataContainer.h:22
The PDF dictionary data type of PoDoFo (inherits from PdfDataContainer, the base class for such repre...
Definition PdfDictionary.h:82
PdfDocument is the core interface for working with PDF documents.
Definition PdfDocument.h:111
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 PdfName.
Definition PdfName.h:24
A PDF stream can be appended to any PdfObject and can contain arbitrary data.
Definition PdfObjectStream.h:87
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:35
bool IsDelayedLoadDone() const
Returns true if delayed loading is disabled, or if it is enabled and loading has completed.
Definition PdfObject.h:440
PdfDocument * GetDocument() const
Get the document of this object.
Definition PdfObject.h:421
PdfObject(std::nullptr_t)
Create a "null" PDF object.
bool IsDirty() const
The dirty flag is set if this variant has been modified after construction.
Definition PdfObject.h:416
const PdfReference & GetIndirectReference() const
Get an indirect reference to this object.
Definition PdfObject.h:431
A reference is a pointer to a object in the PDF file of the form "4 0 R", where 4 is the object numbe...
Definition PdfReference.h:24
A string that can be written to a PDF document.
Definition PdfString.h:24
A simple tokenizer for PDF files and PDF content streams.
Definition PdfTokenizer.h:36
A variant data type which supports all data types supported by the PDF standard.
Definition PdfVariant.h:33
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
PdfDataType
Every PDF datatype that can occur in a PDF file is referenced by an own enum (e.g.
Definition PdfDeclarations.h:167
@ Null
The null datatype is always null.
PdfWriteFlags
Specify additional options for writing the PDF.
Definition PdfDeclarations.h:149
Templatized object type getter helper.
Definition PdfObject.h:609