1 /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. 2 3 Copyright (C) 2007-2014 by Jin-Hwan Cho and Shunsaku Hirata, 4 the dvipdfmx project team. 5 6 Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 21 */ 22 23 #ifndef _PDFOBJ_H_ 24 #define _PDFOBJ_H_ 25 26 #include <stdio.h> 27 28 /* Here is the complete list of PDF object types */ 29 30 #define PDF_BOOLEAN 1 31 #define PDF_NUMBER 2 32 #define PDF_STRING 3 33 #define PDF_NAME 4 34 #define PDF_ARRAY 5 35 #define PDF_DICT 6 36 #define PDF_STREAM 7 37 #define PDF_NULL 8 38 #define PDF_INDIRECT 9 39 #define PDF_UNDEFINED 10 40 41 #define PDF_OBJ_INVALID 0 42 43 #define STREAM_COMPRESS (1 << 0) 44 45 /* A deeper object hierarchy will be considered as (illegal) loop. */ 46 #define PDF_OBJ_MAX_DEPTH 30 47 48 typedef struct pdf_obj pdf_obj; 49 typedef struct pdf_file pdf_file; 50 51 /* External interface to pdf routines */ 52 53 extern int pdf_obj_get_verbose (void); 54 extern void pdf_obj_set_verbose (void); 55 extern void pdf_error_cleanup (void); 56 57 extern void pdf_out_init (const char *filename, int do_encryption); 58 extern void pdf_out_flush (void); 59 extern void pdf_set_version (unsigned version); 60 extern unsigned pdf_get_version (void); 61 62 extern void pdf_release_obj (pdf_obj *object); 63 extern int pdf_obj_typeof (pdf_obj *object); 64 65 #define PDF_OBJ_NUMBERTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_NUMBER) 66 #define PDF_OBJ_BOOLEANTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_BOOLEAN) 67 #define PDF_OBJ_STRINGTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_STRING) 68 #define PDF_OBJ_NAMETYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_NAME) 69 #define PDF_OBJ_ARRAYTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_ARRAY) 70 #define PDF_OBJ_NULLTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_NULL) 71 #define PDF_OBJ_DICTTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_DICT) 72 #define PDF_OBJ_STREAMTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_STREAM) 73 #define PDF_OBJ_INDIRECTTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_INDIRECT) 74 #define PDF_OBJ_UNDEFINED(o) ((o) && pdf_obj_typeof((o)) == PDF_UNDEFINED) 75 76 #define PDF_OBJ_TYPEOF(o) pdf_obj_typeof((o)) 77 78 extern pdf_obj *pdf_ref_obj (pdf_obj *object); 79 extern pdf_obj *pdf_link_obj (pdf_obj *object); 80 81 extern void pdf_transfer_label (pdf_obj *dst, pdf_obj *src); 82 extern pdf_obj *pdf_new_undefined (void); 83 84 extern pdf_obj *pdf_new_null (void); 85 86 extern pdf_obj *pdf_new_boolean (char value); 87 extern char pdf_boolean_value (pdf_obj *object); 88 89 extern pdf_obj *pdf_new_number (double value); 90 extern void pdf_set_number (pdf_obj *object, double value); 91 extern double pdf_number_value (pdf_obj *number); 92 93 extern pdf_obj *pdf_new_string (const void *str, unsigned length); 94 extern void pdf_set_string (pdf_obj *object, unsigned char *str, unsigned length); 95 extern void *pdf_string_value (pdf_obj *object); 96 extern unsigned pdf_string_length (pdf_obj *object); 97 98 /* Name does not include the / */ 99 extern pdf_obj *pdf_new_name (const char *name); 100 extern char *pdf_name_value (pdf_obj *object); 101 102 extern pdf_obj *pdf_new_array (void); 103 /* pdf_add_dict requires key but pdf_add_array does not. 104 * pdf_add_array always append elements to array. 105 * They should be pdf_put_array(array, idx, element) and 106 * pdf_put_dict(dict, key, value) 107 */ 108 extern void pdf_add_array (pdf_obj *array, pdf_obj *object); 109 #if 0 110 extern void pdf_put_array (pdf_obj *array, unsigned idx, pdf_obj *object); 111 #endif 112 extern pdf_obj *pdf_get_array (pdf_obj *array, long idx); 113 extern unsigned pdf_array_length (pdf_obj *array); 114 115 #if 0 116 extern pdf_obj *pdf_shift_array (pdf_obj *array); 117 extern pdf_obj *pdf_pop_array (pdf_obj *array); 118 #endif 119 120 extern pdf_obj *pdf_new_dict (void); 121 extern void pdf_remove_dict (pdf_obj *dict, const char *key); 122 extern void pdf_merge_dict (pdf_obj *dict1, pdf_obj *dict2); 123 extern pdf_obj *pdf_lookup_dict (pdf_obj *dict, const char *key); 124 extern pdf_obj *pdf_dict_keys (pdf_obj *dict); 125 126 /* pdf_add_dict() want pdf_obj as key, however, key must always be name 127 * object and pdf_lookup_dict() and pdf_remove_dict() uses const char as 128 * key. This strange difference seems come from pdfdoc that first allocate 129 * name objects frequently used (maybe 1000 times) such as /Type and does 130 * pdf_link_obj() it rather than allocate/free-ing them each time. But I 131 * already removed that. 132 */ 133 extern int pdf_add_dict (pdf_obj *dict, pdf_obj *key, pdf_obj *value); 134 #if 0 135 extern void pdf_put_dict (pdf_obj *dict, const char *key, pdf_obj *value); 136 #endif 137 138 /* Apply proc(key, value, pdata) for each key-value pairs in dict, stop if proc() 139 * returned non-zero value (and that value is returned). PDF object is passed for 140 * key to allow modification (fix) of key. 141 */ 142 extern int pdf_foreach_dict (pdf_obj *dict, 143 int (*proc) (pdf_obj *, pdf_obj *, void *), 144 void *pdata); 145 146 extern pdf_obj *pdf_new_stream (int flags); 147 extern void pdf_add_stream (pdf_obj *stream, 148 const void *stream_data_ptr, 149 long stream_data_len); 150 #if HAVE_ZLIB 151 extern int pdf_add_stream_flate (pdf_obj *stream, 152 const void *stream_data_ptr, 153 long stream_data_len); 154 #endif 155 extern int pdf_concat_stream (pdf_obj *dst, pdf_obj *src); 156 extern pdf_obj *pdf_stream_dict (pdf_obj *stream); 157 extern long pdf_stream_length (pdf_obj *stream); 158 #if 0 159 extern void pdf_stream_set_flags (pdf_obj *stream, int flags); 160 extern int pdf_stream_get_flags (pdf_obj *stream); 161 #endif 162 extern const void *pdf_stream_dataptr (pdf_obj *stream); 163 164 #if 0 165 extern int pdf_stream_pop_filter (pdf_obj *stream); 166 #endif 167 168 /* Compare label of two indirect reference object. 169 */ 170 extern int pdf_compare_reference (pdf_obj *ref1, pdf_obj *ref2); 171 172 /* The following routines are not appropriate for pdfobj. 173 */ 174 175 extern void pdf_set_compression (int level); 176 177 extern void pdf_set_info (pdf_obj *obj); 178 extern void pdf_set_root (pdf_obj *obj); 179 extern void pdf_set_id (pdf_obj *id); 180 extern void pdf_set_encrypt (pdf_obj *encrypt); 181 182 extern void pdf_files_init (void); 183 extern void pdf_files_close (void); 184 extern int check_for_pdf (FILE *file); 185 extern pdf_file *pdf_open (const char *ident, FILE *file); 186 extern void pdf_close (pdf_file *pf); 187 extern pdf_obj *pdf_file_get_trailer (pdf_file *pf); 188 extern int pdf_file_get_version (pdf_file *pf); 189 extern pdf_obj *pdf_file_get_catalog (pdf_file *pf); 190 191 extern pdf_obj *pdf_deref_obj (pdf_obj *object); 192 extern pdf_obj *pdf_import_object (pdf_obj *object); 193 194 extern int pdfobj_escape_str (char *buffer, int size, const unsigned char *s, int len); 195 196 extern pdf_obj *pdf_new_indirect (pdf_file *pf, unsigned long label, unsigned short generation); 197 198 #endif /* _PDFOBJ_H_ */ 199