1 #ifndef MUPDF_PDF_OBJECT_H
2 #define MUPDF_PDF_OBJECT_H
3 
4 typedef struct pdf_document pdf_document;
5 typedef struct pdf_crypt pdf_crypt;
6 
7 /* Defined in PDF 1.7 according to Acrobat limit. */
8 #define PDF_MAX_OBJECT_NUMBER 8388607
9 #define PDF_MAX_GEN_NUMBER 65535
10 
11 /*
12  * Dynamic objects.
13  * The same type of objects as found in PDF and PostScript.
14  * Used by the filters and the mupdf parser.
15  */
16 
17 typedef struct pdf_obj pdf_obj;
18 
19 pdf_obj *pdf_new_int(fz_context *ctx, int64_t i);
20 pdf_obj *pdf_new_real(fz_context *ctx, float f);
21 pdf_obj *pdf_new_name(fz_context *ctx, const char *str);
22 pdf_obj *pdf_new_string(fz_context *ctx, const char *str, size_t len);
23 
24 /*
25 	Create a PDF 'text string' by encoding input string as either ASCII or UTF-16BE.
26 	In theory, we could also use PDFDocEncoding.
27 */
28 pdf_obj *pdf_new_text_string(fz_context *ctx, const char *s);
29 pdf_obj *pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen);
30 pdf_obj *pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap);
31 pdf_obj *pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap);
32 pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, fz_rect rect);
33 pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, fz_matrix mtx);
34 pdf_obj *pdf_new_date(fz_context *ctx, pdf_document *doc, int64_t time);
35 pdf_obj *pdf_copy_array(fz_context *ctx, pdf_obj *array);
36 pdf_obj *pdf_copy_dict(fz_context *ctx, pdf_obj *dict);
37 pdf_obj *pdf_deep_copy_obj(fz_context *ctx, pdf_obj *obj);
38 
39 pdf_obj *pdf_keep_obj(fz_context *ctx, pdf_obj *obj);
40 void pdf_drop_obj(fz_context *ctx, pdf_obj *obj);
41 
42 int pdf_is_null(fz_context *ctx, pdf_obj *obj);
43 int pdf_is_bool(fz_context *ctx, pdf_obj *obj);
44 int pdf_is_int(fz_context *ctx, pdf_obj *obj);
45 int pdf_is_real(fz_context *ctx, pdf_obj *obj);
46 int pdf_is_number(fz_context *ctx, pdf_obj *obj);
47 int pdf_is_name(fz_context *ctx, pdf_obj *obj);
48 int pdf_is_string(fz_context *ctx, pdf_obj *obj);
49 int pdf_is_array(fz_context *ctx, pdf_obj *obj);
50 int pdf_is_dict(fz_context *ctx, pdf_obj *obj);
51 int pdf_is_indirect(fz_context *ctx, pdf_obj *obj);
52 
53 /*
54 	Check if an object is a stream or not.
55 */
56 int pdf_obj_num_is_stream(fz_context *ctx, pdf_document *doc, int num);
57 int pdf_is_stream(fz_context *ctx, pdf_obj *obj);
58 int pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b);
59 int pdf_objcmp_resolve(fz_context *ctx, pdf_obj *a, pdf_obj *b);
60 int pdf_name_eq(fz_context *ctx, pdf_obj *a, pdf_obj *b);
61 
62 int pdf_obj_marked(fz_context *ctx, pdf_obj *obj);
63 int pdf_mark_obj(fz_context *ctx, pdf_obj *obj);
64 void pdf_unmark_obj(fz_context *ctx, pdf_obj *obj);
65 
66 void pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo);
67 int pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo);
68 
69 int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj);
70 void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj);
71 void pdf_clean_obj(fz_context *ctx, pdf_obj *obj);
72 
73 int pdf_to_bool(fz_context *ctx, pdf_obj *obj);
74 int pdf_to_int(fz_context *ctx, pdf_obj *obj);
75 int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj);
76 float pdf_to_real(fz_context *ctx, pdf_obj *obj);
77 const char *pdf_to_name(fz_context *ctx, pdf_obj *obj);
78 const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj);
79 const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep);
80 char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj);
81 size_t pdf_to_str_len(fz_context *ctx, pdf_obj *obj);
82 int pdf_to_num(fz_context *ctx, pdf_obj *obj);
83 int pdf_to_gen(fz_context *ctx, pdf_obj *obj);
84 
85 int pdf_array_len(fz_context *ctx, pdf_obj *array);
86 pdf_obj *pdf_array_get(fz_context *ctx, pdf_obj *array, int i);
87 void pdf_array_put(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
88 void pdf_array_put_drop(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
89 void pdf_array_push(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
90 void pdf_array_push_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
91 void pdf_array_insert(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
92 void pdf_array_insert_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
93 void pdf_array_delete(fz_context *ctx, pdf_obj *array, int index);
94 int pdf_array_find(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
95 int pdf_array_contains(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
96 
97 int pdf_dict_len(fz_context *ctx, pdf_obj *dict);
98 pdf_obj *pdf_dict_get_key(fz_context *ctx, pdf_obj *dict, int idx);
99 pdf_obj *pdf_dict_get_val(fz_context *ctx, pdf_obj *dict, int idx);
100 void pdf_dict_put_val_null(fz_context *ctx, pdf_obj *obj, int idx);
101 pdf_obj *pdf_dict_get(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
102 pdf_obj *pdf_dict_getp(fz_context *ctx, pdf_obj *dict, const char *path);
103 pdf_obj *pdf_dict_getl(fz_context *ctx, pdf_obj *dict, ...);
104 pdf_obj *pdf_dict_geta(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *abbrev);
105 pdf_obj *pdf_dict_gets(fz_context *ctx, pdf_obj *dict, const char *key);
106 pdf_obj *pdf_dict_getsa(fz_context *ctx, pdf_obj *dict, const char *key, const char *abbrev);
107 pdf_obj *pdf_dict_get_inheritable(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
108 void pdf_dict_put(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
109 void pdf_dict_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
110 void pdf_dict_get_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val, pdf_obj **old_val);
111 void pdf_dict_puts(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
112 void pdf_dict_puts_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
113 void pdf_dict_putp(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
114 void pdf_dict_putp_drop(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
115 void pdf_dict_putl(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
116 void pdf_dict_putl_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
117 void pdf_dict_del(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
118 void pdf_dict_dels(fz_context *ctx, pdf_obj *dict, const char *key);
119 void pdf_sort_dict(fz_context *ctx, pdf_obj *dict);
120 
121 void pdf_dict_put_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int x);
122 void pdf_dict_put_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t x);
123 void pdf_dict_put_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key, double x);
124 void pdf_dict_put_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
125 void pdf_dict_put_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x, size_t n);
126 void pdf_dict_put_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
127 void pdf_dict_put_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_rect x);
128 void pdf_dict_put_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_matrix x);
129 void pdf_dict_put_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t time);
130 pdf_obj *pdf_dict_put_array(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
131 pdf_obj *pdf_dict_put_dict(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
132 pdf_obj *pdf_dict_puts_dict(fz_context *ctx, pdf_obj *dict, const char *key, int initial);
133 
134 int pdf_dict_get_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
135 int pdf_dict_get_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
136 float pdf_dict_get_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
137 const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
138 const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
139 const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
140 fz_rect pdf_dict_get_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
141 fz_matrix pdf_dict_get_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
142 int64_t pdf_dict_get_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
143 
144 void pdf_array_push_bool(fz_context *ctx, pdf_obj *array, int x);
145 void pdf_array_push_int(fz_context *ctx, pdf_obj *array, int64_t x);
146 void pdf_array_push_real(fz_context *ctx, pdf_obj *array, double x);
147 void pdf_array_push_name(fz_context *ctx, pdf_obj *array, const char *x);
148 void pdf_array_push_string(fz_context *ctx, pdf_obj *array, const char *x, size_t n);
149 void pdf_array_push_text_string(fz_context *ctx, pdf_obj *array, const char *x);
150 pdf_obj *pdf_array_push_array(fz_context *ctx, pdf_obj *array, int initial);
151 pdf_obj *pdf_array_push_dict(fz_context *ctx, pdf_obj *array, int initial);
152 
153 int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index);
154 int pdf_array_get_int(fz_context *ctx, pdf_obj *array, int index);
155 float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index);
156 const char *pdf_array_get_name(fz_context *ctx, pdf_obj *array, int index);
157 const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep);
158 const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index);
159 fz_rect pdf_array_get_rect(fz_context *ctx, pdf_obj *array, int index);
160 fz_matrix pdf_array_get_matrix(fz_context *ctx, pdf_obj *array, int index);
161 
162 void pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num);
163 
164 int pdf_obj_refs(fz_context *ctx, pdf_obj *ref);
165 
166 int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj);
167 
168 char *pdf_sprint_obj(fz_context *ctx, char *buf, size_t cap, size_t *len, pdf_obj *obj, int tight, int ascii);
169 void pdf_print_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight, int ascii);
170 void pdf_print_encrypted_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight, int ascii, pdf_crypt *crypt, int num, int gen);
171 
172 void pdf_debug_obj(fz_context *ctx, pdf_obj *obj);
173 void pdf_debug_ref(fz_context *ctx, pdf_obj *obj);
174 
175 /*
176 	Convert Unicode/PdfDocEncoding string into utf-8.
177 
178 	The returned string must be freed by the caller.
179 */
180 char *pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *srcptr, size_t srclen);
181 
182 /*
183 	Convert text string object to UTF-8.
184 
185 	The returned string must be freed by the caller.
186 */
187 char *pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src);
188 
189 /*
190 	Load text stream and convert to UTF-8.
191 
192 	The returned string must be freed by the caller.
193 */
194 char *pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src);
195 
196 /*
197 	Load text stream or text string and convert to UTF-8.
198 
199 	The returned string must be freed by the caller.
200 */
201 char *pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src);
202 
203 fz_quad pdf_to_quad(fz_context *ctx, pdf_obj *array, int offset);
204 fz_rect pdf_to_rect(fz_context *ctx, pdf_obj *array);
205 fz_matrix pdf_to_matrix(fz_context *ctx, pdf_obj *array);
206 int64_t pdf_to_date(fz_context *ctx, pdf_obj *time);
207 
208 pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj);
209 pdf_document *pdf_get_bound_document(fz_context *ctx, pdf_obj *obj);
210 void pdf_set_int(fz_context *ctx, pdf_obj *obj, int64_t i);
211 
212 /* Voodoo to create PDF_NAME(Foo) macros from name-table.h */
213 
214 #define PDF_NAME(X) ((pdf_obj*)(intptr_t)PDF_ENUM_NAME_##X)
215 
216 #define PDF_MAKE_NAME(STRING,NAME) PDF_ENUM_NAME_##NAME,
217 enum {
218 	PDF_ENUM_NULL,
219 	PDF_ENUM_TRUE,
220 	PDF_ENUM_FALSE,
221 #include "mupdf/pdf/name-table.h"
222 	PDF_ENUM_LIMIT,
223 };
224 #undef PDF_MAKE_NAME
225 
226 #define PDF_NULL ((pdf_obj*)(intptr_t)PDF_ENUM_NULL)
227 #define PDF_TRUE ((pdf_obj*)(intptr_t)PDF_ENUM_TRUE)
228 #define PDF_FALSE ((pdf_obj*)(intptr_t)PDF_ENUM_FALSE)
229 #define PDF_LIMIT ((pdf_obj*)(intptr_t)PDF_ENUM_LIMIT)
230 
231 /* Implementation details: subject to change. */
232 
233 /*
234 	for use by pdf_crypt_obj_imp to decrypt AES string in place
235 */
236 void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, size_t newlen);
237 
238 #endif
239