37
37
// --------------------------------------------------------------------
50
class IPE_EXPORT IpePdfObj {
52
virtual ~IpePdfObj() = 0;
53
virtual const IpePdfNull *Null() const;
54
virtual const IpePdfBool *Bool() const;
55
virtual const IpePdfNumber *Number() const;
56
virtual const IpePdfString *String() const;
57
virtual const IpePdfName *Name() const;
58
virtual const IpePdfRef *Ref() const;
59
virtual const IpePdfArray *Array() const;
60
virtual const IpePdfDict *Dict() const;
61
virtual void Write(IpeStream &stream) const = 0;
62
IpeString Repr() const;
65
class IPE_EXPORT IpePdfNull : public IpePdfObj {
67
explicit IpePdfNull() { /* nothing */ }
68
virtual const IpePdfNull *Null() const;
69
virtual void Write(IpeStream &stream) const;
72
class IPE_EXPORT IpePdfBool : public IpePdfObj {
74
explicit IpePdfBool(bool val) : iValue(val) { /* nothing */ }
75
virtual const IpePdfBool *Bool() const;
76
virtual void Write(IpeStream &stream) const;
77
inline bool Value() const { return iValue; }
82
class IPE_EXPORT IpePdfNumber : public IpePdfObj {
84
explicit IpePdfNumber(double val) : iValue(val) { /* nothing */ }
85
virtual const IpePdfNumber *Number() const;
86
virtual void Write(IpeStream &stream) const;
87
inline double Value() const { return iValue; }
92
class IPE_EXPORT IpePdfString : public IpePdfObj {
94
explicit IpePdfString(const IpeString &val) : iValue(val) { /* nothing */ }
95
virtual const IpePdfString *String() const;
96
virtual void Write(IpeStream &stream) const;
97
inline IpeString Value() const { return iValue; }
102
class IPE_EXPORT IpePdfName : public IpePdfObj {
104
explicit IpePdfName(const IpeString &val) : iValue(val) { /* nothing */ }
105
virtual const IpePdfName *Name() const;
106
virtual void Write(IpeStream &stream) const;
107
inline IpeString Value() const { return iValue; }
112
class IPE_EXPORT IpePdfRef : public IpePdfObj {
114
explicit IpePdfRef(int val) : iValue(val) { /* nothing */ }
115
virtual const IpePdfRef *Ref() const;
116
virtual void Write(IpeStream &stream) const;
117
inline int Value() const { return iValue; }
122
class IPE_EXPORT IpePdfArray : public IpePdfObj {
124
explicit IpePdfArray() { /* nothing */ }
126
virtual const IpePdfArray *Array() const;
127
virtual void Write(IpeStream &stream) const;
128
void Append(const IpePdfObj *);
129
inline int Count() const { return iObjects.size(); }
130
const IpePdfObj *Obj(int index, const IpePdfFile *file) const;
132
std::vector<const IpePdfObj *> iObjects;
135
class IPE_EXPORT IpePdfDict : public IpePdfObj {
137
explicit IpePdfDict() { /* nothing */ }
139
virtual const IpePdfDict *Dict() const;
140
virtual void Write(IpeStream &stream) const;
141
void SetStream(const IpeBuffer &stream);
142
void Add(IpeString key, const IpePdfObj *obj);
143
const IpePdfObj *Get(IpeString key, const IpePdfFile *file) const;
144
inline int Count() const { return iItems.size(); }
145
inline IpeString Key(int index) const { return iItems[index].iKey; }
146
inline IpeBuffer Stream() const { return iStream; }
147
bool Deflated() const;
148
// IpeBuffer Inflate() const;
152
const IpePdfObj *iVal;
154
std::vector<Item> iItems;
158
// --------------------------------------------------------------------
160
//! A PDF lexical token.
162
//! The various types of tokens.
163
enum TToken { EErr, EOp, EName, ENumber, EString, ETrue, EFalse, ENull,
164
EArrayBg, EArrayEnd, EDictBg, EDictEnd };
165
//! The type of this token.
167
//! The string representing this token.
171
class IPE_EXPORT IpePdfParser {
173
IpePdfParser(IpeDataSource &source);
175
inline void GetChar() { iCh = iSource.GetChar(); ++iPos; }
176
inline bool Eos() const { return (iCh == EOF); }
177
inline IpePdfToken Token() const { return iTok; }
180
IpePdfObj *GetObject();
181
IpePdfObj *GetObjectDef();
182
IpePdfDict *GetTrailer();
186
void SkipWhiteSpace();
187
IpePdfArray *MakeArray();
188
IpePdfDict *MakeDict();
191
IpeDataSource &iSource;
197
class IPE_EXPORT IpePdfFile {
201
bool Parse(IpeDataSource &source);
202
const IpePdfObj *Object(int num) const;
203
const IpePdfDict *Catalog() const;
204
const IpePdfDict *Page() const;
206
std::map<int, const IpePdfObj *> iObjects;
207
const IpePdfDict *iTrailer;
54
virtual ~PdfObj() = 0;
55
virtual const PdfNull *null() const;
56
virtual const PdfBool *boolean() const;
57
virtual const PdfNumber *number() const;
58
virtual const PdfString *string() const;
59
virtual const PdfName *name() const;
60
virtual const PdfRef *ref() const;
61
virtual const PdfArray *array() const;
62
virtual const PdfDict *dict() const;
63
virtual void write(Stream &stream) const = 0;
67
class PdfNull : public PdfObj {
69
explicit PdfNull() { /* nothing */ }
70
virtual const PdfNull *null() const;
71
virtual void write(Stream &stream) const;
74
class PdfBool : public PdfObj {
76
explicit PdfBool(bool val) : iValue(val) { /* nothing */ }
77
virtual const PdfBool *boolean() const;
78
virtual void write(Stream &stream) const;
79
inline bool value() const { return iValue; }
84
class PdfNumber : public PdfObj {
86
explicit PdfNumber(double val) : iValue(val) { /* nothing */ }
87
virtual const PdfNumber *number() const;
88
virtual void write(Stream &stream) const;
89
inline double value() const { return iValue; }
94
class PdfString : public PdfObj {
96
explicit PdfString(const String &val) : iValue(val) { /* nothing */ }
97
virtual const PdfString *string() const;
98
virtual void write(Stream &stream) const;
99
inline String value() const { return iValue; }
104
class PdfName : public PdfObj {
106
explicit PdfName(const String &val) : iValue(val) { /* nothing */ }
107
virtual const PdfName *name() const;
108
virtual void write(Stream &stream) const;
109
inline String value() const { return iValue; }
114
class PdfRef : public PdfObj {
116
explicit PdfRef(int val) : iValue(val) { /* nothing */ }
117
virtual const PdfRef *ref() const;
118
virtual void write(Stream &stream) const;
119
inline int value() const { return iValue; }
124
class PdfArray : public PdfObj {
126
explicit PdfArray() { /* nothing */ }
128
virtual const PdfArray *array() const;
129
virtual void write(Stream &stream) const;
130
void append(const PdfObj *);
131
inline int count() const { return iObjects.size(); }
132
const PdfObj *obj(int index, const PdfFile *file) const;
134
std::vector<const PdfObj *> iObjects;
137
class PdfDict : public PdfObj {
139
explicit PdfDict() { /* nothing */ }
141
virtual const PdfDict *dict() const;
142
virtual void write(Stream &stream) const;
143
void setStream(const Buffer &stream);
144
void add(String key, const PdfObj *obj);
145
const PdfObj *get(String key, const PdfFile *file) const;
146
inline int count() const { return iItems.size(); }
147
inline String key(int index) const { return iItems[index].iKey; }
148
inline Buffer stream() const { return iStream; }
149
bool deflated() const;
150
// Buffer Inflate() const;
156
std::vector<Item> iItems;
160
// --------------------------------------------------------------------
162
//! A PDF lexical token.
164
//! The various types of tokens.
165
enum TToken { EErr, EOp, EName, ENumber, EString, ETrue, EFalse, ENull,
166
EArrayBg, EArrayEnd, EDictBg, EDictEnd };
167
//! The type of this token.
169
//! The string representing this token.
175
PdfParser(DataSource &source);
177
inline void getChar() { iCh = iSource.getChar(); ++iPos; }
178
inline bool eos() const { return (iCh == EOF); }
179
inline PdfToken token() const { return iTok; }
183
PdfObj *getObjectDef();
184
PdfDict *getTrailer();
188
void skipWhiteSpace();
189
PdfArray *makeArray();
203
bool parse(DataSource &source);
204
const PdfObj *object(int num) const;
205
const PdfDict *catalog() const;
206
const PdfDict *page() const;
208
std::map<int, const PdfObj *> iObjects;
209
const PdfDict *iTrailer;
210
214
// --------------------------------------------------------------------