9#include "PdfObjectStream.h"
14class PdfIndirectObjectList;
18class PdfDataContainer;
37 friend class PdfObjectOutputStream;
39 friend class PdfDictionaryElement;
40 friend class PdfArrayElement;
45 PODOFO_PRIVATE_FRIEND(
class PdfParser);
49 PODOFO_PRIVATE_FRIEND(
class PdfXRef);
126 std::string_view GetDataTypeString()
const;
132 bool IsNumber()
const;
137 bool IsRealStrict()
const;
140 bool IsNumberOrReal()
const;
143 bool IsString()
const;
149 bool IsArray()
const;
152 bool IsDictionary()
const;
155 bool IsRawData()
const;
161 bool IsReference()
const;
171 bool GetBool()
const;
172 bool TryGetBool(
bool& value)
const;
178 int64_t GetNumberLenient()
const;
179 bool TryGetNumberLenient(
int64_t& value)
const;
186 bool TryGetNumber(
int64_t& value)
const;
192 double GetReal()
const;
193 bool TryGetReal(
double& value)
const;
199 double GetRealStrict()
const;
200 bool TryGetRealStrict(
double& value)
const;
208 const PdfName& GetName()
const;
238 void SetBool(
bool b);
252 void SetReal(
double d);
270 void ForceCreateStream();
305 virtual bool TryUnload();
311 bool HasStream()
const;
313 bool IsIndirect()
const;
358 inline bool IsDirty()
const {
return m_IsDirty; }
379 inline bool IsDelayedLoadStreamDone()
const {
return m_IsDelayedLoadStreamDone; }
381 const PdfObjectStream* GetStream()
const;
382 PdfObjectStream* GetStream();
385 PdfObject(PdfVariant&& var,
const PdfReference& indirectReference,
bool isDirty);
387 PdfObject(PdfArray* arr);
390 PdfObject(PdfDataContainer& parent, std::nullptr_t);
391 PdfObject(PdfDataContainer& parent,
const PdfObject& rhs);
392 PdfObject(PdfDataContainer& parent, PdfObject&& rhs)
noexcept;
401 void DelayedLoad()
const;
416 virtual void delayedLoad();
418 void DelayedLoadStream()
const;
420 virtual void delayedLoadStream();
423 virtual bool removeStream();
425 virtual bool HasStreamToParse()
const;
438 void SetDocument(PdfDocument* document);
440 void SetVariantOwner();
448 void RelocateBackPointers();
452 PdfObjectStream& getOrCreateStream();
454 void forceCreateStream();
456 PdfObjectStream* getStream();
458 void EnableDelayedLoadingStream();
460 void MakeDelayedLoadingStreamDone();
462 inline void SetIndirectReference(
const PdfReference& reference) { m_IndirectReference = reference; }
471 void EnableDelayedLoading();
475 virtual void SetRevised();
478 void DelayedLoad(
bool throwOnError)
const;
479 void DelayedLoadStream(
bool throwOnError)
const;
482 PdfVariant& GetVariantUnsafe() {
return m_Variant; }
483 const PdfReference& GetReferenceUnsafe()
const {
return m_Variant.GetReferenceUnsafe(); }
484 const PdfDictionary& GetDictionaryUnsafe()
const {
return m_Variant.GetDictionaryUnsafe(); }
485 const PdfArray& GetArrayUnsafe()
const {
return m_Variant.GetArrayUnsafe(); }
486 PdfDictionary& GetDictionaryUnsafe() {
return m_Variant.GetDictionaryUnsafe(); }
487 PdfArray& GetArrayUnsafe() {
return m_Variant.GetArrayUnsafe(); }
488 void WriteFinal(OutputStream& stream, PdfWriteFlags writeMode,
489 const PdfStatefulEncrypt* encrypt, charbuff& buffer);
492 void SetNumberNoDirtySet(int64_t l);
496 void WriteHeader(OutputStream& stream, PdfWriteFlags writeMode, charbuff& buffer)
const;
499 bool IsImmutable()
const {
return m_IsImmutable; }
502 void AssignNoDirtySet(PdfObject&& rhs);
503 void AssignNoDirtySet(PdfVariant&& rhs);
504 void AssignNoDirtySet(
const PdfObject& rhs);
506 void SetParent(PdfDataContainer& parent);
509 void write(OutputStream& stream,
bool skipLengthFix,
510 PdfWriteFlags writeMode,
const PdfStatefulEncrypt* encrypt, charbuff& buffer)
const;
512 void assertMutable()
const;
514 void assign(
const PdfObject& rhs);
516 void moveFrom(PdfObject&& rhs)
noexcept;
518 void setVariantOwnerIfNeeded();
528 PdfObject(T*) =
delete;
530 void copyStreamFrom(
const PdfObject& obj);
535 void initContainedObject();
538 PdfVariant m_Variant;
541 PdfReference m_IndirectReference;
546 PdfDataContainer* m_Parent;
547 PdfDocument* m_Document;
549 std::unique_ptr<PdfObjectStream> m_Stream;
554 mutable bool m_IsDelayedLoadDone;
555 mutable bool m_IsDelayedLoadStreamDone;
560 template <
typename T>
596 return obj.GetBool();
599 static bool Get(
const PdfObject& obj,
bool fallback)
602 if (obj.TryGetBool(ret))
608 static bool TryGet(
const PdfObject& obj,
bool& value)
610 return obj.TryGetBool(value);
615 struct ObjectAdapter<int64_t>
617 using TRet = int64_t;
619 static int64_t Get(
const PdfObject& obj)
621 return obj.GetNumber();
624 static int64_t Get(
const PdfObject& obj, int64_t fallback)
627 if (obj.TryGetNumber(ret))
633 static bool TryGet(
const PdfObject& obj, int64_t& value)
635 return obj.TryGetNumber(value);
640 struct ObjectAdapter<double>
644 static double Get(
const PdfObject& obj)
646 return obj.GetReal();
649 static double Get(
const PdfObject& obj,
double fallback)
652 if (obj.TryGetReal(ret))
658 static bool TryGet(
const PdfObject& obj,
double& value)
660 return obj.TryGetReal(value);
665 struct ObjectAdapter<PdfReference>
667 using TRet = PdfReference;
669 static PdfReference Get(
const PdfObject& obj)
671 return obj.GetReference();
674 static PdfReference Get(
const PdfObject& obj,
const PdfReference& fallback)
677 if (obj.TryGetReference(ret))
683 static bool TryGet(
const PdfObject& obj, PdfReference& value)
685 return obj.TryGetReference(value);
690 struct ObjectAdapter<PdfName>
692 using TRet =
const PdfName&;
694 static const PdfName& Get(
const PdfObject& obj)
696 return obj.GetName();
699 static const PdfName& Get(
const PdfObject& obj,
const PdfName& fallback)
702 if (obj.TryGetName(ret))
708 static bool TryGet(
const PdfObject& obj, PdfName& value)
710 return obj.TryGetName(value);
715 struct ObjectAdapter<const PdfName*>
717 using TRet =
const PdfName*;
719 static const PdfName* Get(
const PdfObject& obj)
722 (void)obj.TryGetName(ret);
726 static const PdfName* Get(
const PdfObject& obj,
const PdfName* fallback)
729 if (obj.TryGetName(ret))
735 static bool TryGet(
const PdfObject& obj,
const PdfName*& value)
737 return obj.TryGetName(value);
742 struct ObjectAdapter<PdfString>
744 using TRet =
const PdfString&;
746 static const PdfString& Get(
const PdfObject& obj)
748 return obj.GetString();
751 static const PdfString& Get(
const PdfObject& obj,
const PdfString& fallback)
753 const PdfString* ret;
754 if (obj.TryGetString(ret))
760 static bool TryGet(
const PdfObject& obj, PdfString& value)
762 return obj.TryGetString(value);
767 struct ObjectAdapter<const PdfString*>
769 using TRet =
const PdfString*;
771 static const PdfString* Get(PdfObject& obj)
773 const PdfString* ret;
774 (void)obj.TryGetString(ret);
778 static const PdfString* Get(
const PdfObject& obj,
const PdfString* fallback)
780 const PdfString* ret;
781 if (obj.TryGetString(ret))
787 static bool TryGet(
const PdfObject& obj,
const PdfString*& value)
789 return obj.TryGetString(value);
794 struct ObjectAdapter<PdfDictionary*>
796 using TRet = PdfDictionary*;
798 static PdfDictionary* Get(PdfObject& obj)
801 (void)obj.TryGetDictionary(ret);
805 static PdfDictionary* Get(PdfObject& obj, PdfDictionary* fallback)
808 if (obj.TryGetDictionary(ret))
814 static bool TryGet(PdfObject& obj, PdfDictionary*& value)
816 return obj.TryGetDictionary(value);
821 struct ObjectAdapter<const PdfDictionary*>
823 using TRet =
const PdfDictionary*;
825 static const PdfDictionary* Get(
const PdfObject& obj)
827 const PdfDictionary* ret;
828 (void)obj.TryGetDictionary(ret);
832 static const PdfDictionary* Get(
const PdfObject& obj,
const PdfDictionary* fallback)
834 const PdfDictionary* ret;
835 if (obj.TryGetDictionary(ret))
841 static bool TryGet(
const PdfObject& obj,
const PdfDictionary*& value)
843 return obj.TryGetDictionary(value);
848 struct ObjectAdapter<PdfDictionary>
850 using TRet = PdfDictionary&;
852 static PdfDictionary& Get(PdfObject& obj)
854 return obj.GetDictionary();
857 static PdfDictionary& Get(PdfObject& obj, PdfDictionary& fallback)
860 if (obj.TryGetDictionary(ret))
866 static bool TryGet(
const PdfObject& obj, PdfDictionary& value)
868 return obj.TryGetDictionary(value);
873 struct ObjectAdapter<PdfArray*>
875 using TRet = PdfArray*;
877 static PdfArray* Get(PdfObject& obj)
880 (void)obj.TryGetArray(ret);
884 static PdfArray* Get(PdfObject& obj, PdfArray* fallback)
887 if (obj.TryGetArray(ret))
893 static bool TryGet(PdfObject& obj, PdfArray*& value)
895 return obj.TryGetArray(value);
900 struct ObjectAdapter<const PdfArray*>
902 using TRet =
const PdfArray*;
904 static const PdfArray* Get(
const PdfObject& obj)
907 (void)obj.TryGetArray(ret);
911 static const PdfArray* Get(PdfObject& obj,
const PdfArray* fallback)
914 if (obj.TryGetArray(ret))
920 static bool TryGet(
const PdfObject& obj,
const PdfArray*& value)
922 return obj.TryGetArray(value);
927 struct ObjectAdapter<PdfArray>
929 using TRet = PdfArray&;
931 static PdfArray& Get(PdfObject& obj)
933 return obj.GetArray();
936 static PdfArray& Get(PdfObject& obj, PdfArray& fallback)
939 if (obj.TryGetArray(ret))
945 static bool TryGet(
const PdfObject& obj, PdfArray& value)
947 return obj.TryGetArray(value);
954 struct PODOFO_API PdfObjectInequality final
956 using is_transparent = std::true_type;
958 bool operator()(
const PdfObject* lhs,
const PdfObject* rhs)
const
960 return lhs->GetIndirectReference() < rhs->GetIndirectReference();
962 bool operator()(
const PdfObject* lhs,
const PdfReference& rhs)
const
964 return lhs->GetIndirectReference() < rhs;
966 bool operator()(
const PdfReference& lhs,
const PdfObject* rhs)
const
968 return lhs < rhs->GetIndirectReference();
970 bool operator()(
const PdfObject& lhs,
const PdfObject& rhs)
const
972 return lhs.GetIndirectReference() < rhs.GetIndirectReference();
974 bool operator()(
const PdfObject& lhs,
const PdfReference& rhs)
const
976 return lhs.GetIndirectReference() < rhs;
978 bool operator()(
const PdfReference& lhs,
const PdfObject& rhs)
const
980 return lhs < rhs.GetIndirectReference();
An interface for writing blocks of data to a data source.
Definition OutputStream.h:15
This class represents a PdfArray Use it for all arrays that are written to a PDF file.
Definition PdfArray.h:77
A PdfDataProvider object with a PdfObject owner, specialized in holding objects.
Definition PdfDataContainer.h:18
The PDF dictionary data type of PoDoFo (inherits from PdfDataContainer, the base class for such repre...
Definition PdfDictionary.h:77
PdfDocument is the core interface for working with PDF documents.
Definition PdfDocument.h:108
A list of PdfObjects that constitutes the indirect object list of the document The PdfParser will rea...
Definition PdfIndirectObjectList.h:34
This class represents a PdfName.
Definition PdfName.h:21
A PDF stream can be appended to any PdfObject and can contain arbitrary data.
Definition PdfObjectStream.h:82
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:31
bool IsDelayedLoadDone() const
Returns true if delayed loading is disabled, or if it is enabled and loading has completed.
Definition PdfObject.h:377
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:358
const PdfReference & GetIndirectReference() const
Get an indirect reference to this object.
Definition PdfObject.h:370
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:20
A string that can be written to a PDF document.
Definition PdfString.h:21
A simple tokenizer for PDF files and PDF content streams.
Definition PdfTokenizer.h:47
A variant data type which supports all data types supported by the PDF standard.
Definition PdfVariant.h:29
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:30
All classes, functions, types and enums of PoDoFo are members of these namespace.
Definition basetypes.h:13
PdfDataType
Every PDF datatype that can occur in a PDF file is referenced by an own enum (e.g.
Definition PdfDeclarations.h:152
@ Null
The null datatype is always null.
PdfWriteFlags
Specify additional options for writing the PDF.
Definition PdfDeclarations.h:136
Templatized object type getter helper.
Definition PdfObject.h:562