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