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