comparison mupdf-source/include/mupdf/pdf/object.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 // Copyright (C) 2004-2025 Artifex Software, Inc.
2 //
3 // This file is part of MuPDF.
4 //
5 // MuPDF is free software: you can redistribute it and/or modify it under the
6 // terms of the GNU Affero General Public License as published by the Free
7 // Software Foundation, either version 3 of the License, or (at your option)
8 // any later version.
9 //
10 // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU Affero General Public License
16 // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
17 //
18 // Alternative licensing terms are available from the licensor.
19 // For commercial licensing, see <https://www.artifex.com/> or contact
20 // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
21 // CA 94129, USA, for further information.
22
23 #ifndef MUPDF_PDF_OBJECT_H
24 #define MUPDF_PDF_OBJECT_H
25
26 #include "mupdf/fitz/stream.h"
27
28 typedef struct pdf_document pdf_document;
29 typedef struct pdf_crypt pdf_crypt;
30 typedef struct pdf_journal pdf_journal;
31
32 /* Defined in PDF 1.7 according to Acrobat limit. */
33 #define PDF_MAX_OBJECT_NUMBER 8388607
34 #define PDF_MAX_GEN_NUMBER 65535
35
36 /*
37 * Dynamic objects.
38 * The same type of objects as found in PDF and PostScript.
39 * Used by the filters and the mupdf parser.
40 */
41
42 typedef struct pdf_obj pdf_obj;
43
44 pdf_obj *pdf_new_int(fz_context *ctx, int64_t i);
45 pdf_obj *pdf_new_real(fz_context *ctx, float f);
46 pdf_obj *pdf_new_name(fz_context *ctx, const char *str);
47 pdf_obj *pdf_new_string(fz_context *ctx, const char *str, size_t len);
48
49 /*
50 Create a PDF 'text string' by encoding input string as either ASCII or UTF-16BE.
51 In theory, we could also use PDFDocEncoding.
52 */
53 pdf_obj *pdf_new_text_string(fz_context *ctx, const char *s);
54 pdf_obj *pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen);
55 pdf_obj *pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap);
56 pdf_obj *pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap);
57 pdf_obj *pdf_new_point(fz_context *ctx, pdf_document *doc, fz_point point);
58 pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, fz_rect rect);
59 pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, fz_matrix mtx);
60 pdf_obj *pdf_new_date(fz_context *ctx, pdf_document *doc, int64_t time);
61 pdf_obj *pdf_copy_array(fz_context *ctx, pdf_obj *array);
62 pdf_obj *pdf_copy_dict(fz_context *ctx, pdf_obj *dict);
63 pdf_obj *pdf_deep_copy_obj(fz_context *ctx, pdf_obj *obj);
64
65 pdf_obj *pdf_keep_obj(fz_context *ctx, pdf_obj *obj);
66 void pdf_drop_obj(fz_context *ctx, pdf_obj *obj);
67 pdf_obj *pdf_drop_singleton_obj(fz_context *ctx, pdf_obj *obj);
68
69 int pdf_is_null(fz_context *ctx, pdf_obj *obj);
70 int pdf_is_bool(fz_context *ctx, pdf_obj *obj);
71 int pdf_is_int(fz_context *ctx, pdf_obj *obj);
72 int pdf_is_real(fz_context *ctx, pdf_obj *obj);
73 int pdf_is_number(fz_context *ctx, pdf_obj *obj);
74 int pdf_is_name(fz_context *ctx, pdf_obj *obj);
75 int pdf_is_string(fz_context *ctx, pdf_obj *obj);
76 int pdf_is_array(fz_context *ctx, pdf_obj *obj);
77 int pdf_is_dict(fz_context *ctx, pdf_obj *obj);
78 int pdf_is_indirect(fz_context *ctx, pdf_obj *obj);
79
80 /*
81 Check if an object is a stream or not.
82 */
83 int pdf_obj_num_is_stream(fz_context *ctx, pdf_document *doc, int num);
84 int pdf_is_stream(fz_context *ctx, pdf_obj *obj);
85
86 /* Compare 2 objects. Returns 0 on match, non-zero on mismatch.
87 * Streams always mismatch.
88 */
89 int pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b);
90 int pdf_objcmp_resolve(fz_context *ctx, pdf_obj *a, pdf_obj *b);
91
92 /* Compare 2 objects. Returns 0 on match, non-zero on mismatch.
93 * Stream contents are explicitly checked.
94 */
95 int pdf_objcmp_deep(fz_context *ctx, pdf_obj *a, pdf_obj *b);
96
97 int pdf_name_eq(fz_context *ctx, pdf_obj *a, pdf_obj *b);
98
99 int pdf_obj_marked(fz_context *ctx, pdf_obj *obj);
100 int pdf_mark_obj(fz_context *ctx, pdf_obj *obj);
101 void pdf_unmark_obj(fz_context *ctx, pdf_obj *obj);
102
103 typedef struct pdf_cycle_list pdf_cycle_list;
104 struct pdf_cycle_list {
105 pdf_cycle_list *up;
106 int num;
107 };
108 int pdf_cycle(fz_context *ctx, pdf_cycle_list *here, pdf_cycle_list *prev, pdf_obj *obj);
109
110 typedef struct
111 {
112 int len;
113 unsigned char bits[FZ_FLEXIBLE_ARRAY];
114 } pdf_mark_bits;
115
116 pdf_mark_bits *pdf_new_mark_bits(fz_context *ctx, pdf_document *doc);
117 void pdf_drop_mark_bits(fz_context *ctx, pdf_mark_bits *marks);
118 void pdf_mark_bits_reset(fz_context *ctx, pdf_mark_bits *marks);
119 int pdf_mark_bits_set(fz_context *ctx, pdf_mark_bits *marks, pdf_obj *obj);
120
121 typedef struct
122 {
123 int len;
124 int max;
125 int *list;
126 int local_list[8];
127 } pdf_mark_list;
128
129 int pdf_mark_list_push(fz_context *ctx, pdf_mark_list *list, pdf_obj *obj);
130 void pdf_mark_list_pop(fz_context *ctx, pdf_mark_list *list);
131 int pdf_mark_list_check(fz_context *ctx, pdf_mark_list *list, pdf_obj *obj);
132 void pdf_mark_list_init(fz_context *ctx, pdf_mark_list *list);
133 void pdf_mark_list_free(fz_context *ctx, pdf_mark_list *list);
134
135 void pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo);
136 int pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo);
137
138 int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj);
139 void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj);
140 void pdf_clean_obj(fz_context *ctx, pdf_obj *obj);
141
142 int pdf_to_bool(fz_context *ctx, pdf_obj *obj);
143 int pdf_to_int(fz_context *ctx, pdf_obj *obj);
144 int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj);
145 float pdf_to_real(fz_context *ctx, pdf_obj *obj);
146 const char *pdf_to_name(fz_context *ctx, pdf_obj *obj);
147 const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj);
148 const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep);
149 char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj);
150 size_t pdf_to_str_len(fz_context *ctx, pdf_obj *obj);
151 int pdf_to_num(fz_context *ctx, pdf_obj *obj);
152 int pdf_to_gen(fz_context *ctx, pdf_obj *obj);
153
154 int pdf_to_bool_default(fz_context *ctx, pdf_obj *obj, int def);
155 int pdf_to_int_default(fz_context *ctx, pdf_obj *obj, int def);
156 float pdf_to_real_default(fz_context *ctx, pdf_obj *obj, float def);
157
158 int pdf_array_len(fz_context *ctx, pdf_obj *array);
159 pdf_obj *pdf_array_get(fz_context *ctx, pdf_obj *array, int i);
160 void pdf_array_put(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
161 void pdf_array_put_drop(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
162 void pdf_array_push(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
163 void pdf_array_push_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
164 void pdf_array_insert(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
165 void pdf_array_insert_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
166 void pdf_array_delete(fz_context *ctx, pdf_obj *array, int index);
167 int pdf_array_find(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
168 int pdf_array_contains(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
169
170 int pdf_dict_len(fz_context *ctx, pdf_obj *dict);
171 pdf_obj *pdf_dict_get_key(fz_context *ctx, pdf_obj *dict, int idx);
172 pdf_obj *pdf_dict_get_val(fz_context *ctx, pdf_obj *dict, int idx);
173 void pdf_dict_put_val_null(fz_context *ctx, pdf_obj *obj, int idx);
174 pdf_obj *pdf_dict_get(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
175 pdf_obj *pdf_dict_getp(fz_context *ctx, pdf_obj *dict, const char *path);
176 pdf_obj *pdf_dict_getl(fz_context *ctx, pdf_obj *dict, ...);
177 pdf_obj *pdf_dict_geta(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *abbrev);
178 pdf_obj *pdf_dict_gets(fz_context *ctx, pdf_obj *dict, const char *key);
179 pdf_obj *pdf_dict_getsa(fz_context *ctx, pdf_obj *dict, const char *key, const char *abbrev);
180 pdf_obj *pdf_dict_get_inheritable(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
181 pdf_obj *pdf_dict_getp_inheritable(fz_context *ctx, pdf_obj *dict, const char *path);
182 pdf_obj *pdf_dict_gets_inheritable(fz_context *ctx, pdf_obj *dict, const char *key);
183 void pdf_dict_put(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
184 void pdf_dict_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
185 void pdf_dict_get_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val, pdf_obj **old_val);
186 void pdf_dict_puts(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
187 void pdf_dict_puts_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
188 void pdf_dict_putp(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
189 void pdf_dict_putp_drop(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
190 void pdf_dict_putl(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
191 void pdf_dict_putl_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
192 void pdf_dict_del(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
193 void pdf_dict_dels(fz_context *ctx, pdf_obj *dict, const char *key);
194 void pdf_sort_dict(fz_context *ctx, pdf_obj *dict);
195
196 void pdf_dict_put_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int x);
197 void pdf_dict_put_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t x);
198 void pdf_dict_put_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key, double x);
199 void pdf_dict_put_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
200 void pdf_dict_put_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x, size_t n);
201 void pdf_dict_put_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
202 void pdf_dict_put_indirect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int num);
203 void pdf_dict_put_point(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_point x);
204 void pdf_dict_put_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_rect x);
205 void pdf_dict_put_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_matrix x);
206 void pdf_dict_put_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t time);
207 pdf_obj *pdf_dict_put_array(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
208 pdf_obj *pdf_dict_put_dict(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
209 pdf_obj *pdf_dict_puts_dict(fz_context *ctx, pdf_obj *dict, const char *key, int initial);
210
211 int pdf_dict_get_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
212 int pdf_dict_get_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
213 int64_t pdf_dict_get_int64(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
214 float pdf_dict_get_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
215 const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
216 const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
217 const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
218 const char *pdf_dict_get_text_string_opt(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
219 fz_point pdf_dict_get_point(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
220 fz_rect pdf_dict_get_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
221 fz_matrix pdf_dict_get_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
222 int64_t pdf_dict_get_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
223
224 int pdf_dict_get_bool_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int def);
225 int pdf_dict_get_int_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int def);
226 float pdf_dict_get_real_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, float def);
227
228 int pdf_dict_get_inheritable_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
229 int pdf_dict_get_inheritable_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
230 int64_t pdf_dict_get_inheritable_int64(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
231 float pdf_dict_get_inheritable_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
232 const char *pdf_dict_get_inheritable_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
233 const char *pdf_dict_get_inheritable_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
234 const char *pdf_dict_get_inheritable_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
235 fz_rect pdf_dict_get_inheritable_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
236 fz_matrix pdf_dict_get_inheritable_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
237 int64_t pdf_dict_get_inheritable_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
238
239 void pdf_array_push_bool(fz_context *ctx, pdf_obj *array, int x);
240 void pdf_array_push_int(fz_context *ctx, pdf_obj *array, int64_t x);
241 void pdf_array_push_real(fz_context *ctx, pdf_obj *array, double x);
242 void pdf_array_push_name(fz_context *ctx, pdf_obj *array, const char *x);
243 void pdf_array_push_string(fz_context *ctx, pdf_obj *array, const char *x, size_t n);
244 void pdf_array_push_text_string(fz_context *ctx, pdf_obj *array, const char *x);
245 pdf_obj *pdf_array_push_array(fz_context *ctx, pdf_obj *array, int initial);
246 pdf_obj *pdf_array_push_dict(fz_context *ctx, pdf_obj *array, int initial);
247
248 void pdf_array_put_bool(fz_context *ctx, pdf_obj *array, int i, int x);
249 void pdf_array_put_int(fz_context *ctx, pdf_obj *array, int i, int64_t x);
250 void pdf_array_put_real(fz_context *ctx, pdf_obj *array, int i, double x);
251 void pdf_array_put_name(fz_context *ctx, pdf_obj *array, int i, const char *x);
252 void pdf_array_put_string(fz_context *ctx, pdf_obj *array, int i, const char *x, size_t n);
253 void pdf_array_put_text_string(fz_context *ctx, pdf_obj *array, int i, const char *x);
254 pdf_obj *pdf_array_put_array(fz_context *ctx, pdf_obj *array, int i, int initial);
255 pdf_obj *pdf_array_put_dict(fz_context *ctx, pdf_obj *array, int i, int initial);
256
257 int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index);
258 int pdf_array_get_int(fz_context *ctx, pdf_obj *array, int index);
259 float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index);
260 const char *pdf_array_get_name(fz_context *ctx, pdf_obj *array, int index);
261 const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep);
262 const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index);
263 fz_rect pdf_array_get_rect(fz_context *ctx, pdf_obj *array, int index);
264 fz_matrix pdf_array_get_matrix(fz_context *ctx, pdf_obj *array, int index);
265
266 void pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num);
267
268 int pdf_obj_refs(fz_context *ctx, pdf_obj *ref);
269
270 int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj);
271
272 char *pdf_sprint_obj(fz_context *ctx, char *buf, size_t cap, size_t *len, pdf_obj *obj, int tight, int ascii);
273 void pdf_print_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight, int ascii);
274 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, int *sep);
275
276 void pdf_debug_obj(fz_context *ctx, pdf_obj *obj);
277 void pdf_debug_ref(fz_context *ctx, pdf_obj *obj);
278
279 /*
280 Convert Unicode/PdfDocEncoding string into utf-8.
281
282 The returned string must be freed by the caller.
283 */
284 char *pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *srcptr, size_t srclen);
285
286 /*
287 Convert text string object to UTF-8.
288
289 The returned string must be freed by the caller.
290 */
291 char *pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src);
292
293 /*
294 Load text stream and convert to UTF-8.
295
296 The returned string must be freed by the caller.
297 */
298 char *pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src);
299
300 /*
301 Load text stream or text string and convert to UTF-8.
302
303 The returned string must be freed by the caller.
304 */
305 char *pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src);
306
307 fz_quad pdf_to_quad(fz_context *ctx, pdf_obj *array, int offset);
308 fz_point pdf_to_point(fz_context *ctx, pdf_obj *array, int offset);
309 fz_rect pdf_to_rect(fz_context *ctx, pdf_obj *array);
310 fz_matrix pdf_to_matrix(fz_context *ctx, pdf_obj *array);
311 int64_t pdf_to_date(fz_context *ctx, pdf_obj *time);
312
313 /*
314 pdf_get_indirect_document and pdf_get_bound_document are
315 now deprecated. Please do not use them in future. They will
316 be removed.
317
318 Please use pdf_pin_document instead.
319 */
320 pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj);
321 pdf_document *pdf_get_bound_document(fz_context *ctx, pdf_obj *obj);
322
323 /*
324 pdf_pin_document returns a new reference to the document
325 to which obj is bound. The caller is responsible for
326 dropping this reference once they have finished with it.
327
328 This is a replacement for pdf_get_indirect_document
329 and pdf_get_bound_document that are now deprecated. Those
330 returned a borrowed reference that did not need to be
331 dropped.
332
333 Note that this can validly return NULL in various cases:
334 1) When the object is of a simple type (such as a number
335 or a string), it contains no reference to the enclosing
336 document. 2) When the object has yet to be inserted into
337 a PDF document (such as during parsing). 3) And (in
338 future versions) when the document has been destroyed
339 but the object reference remains.
340
341 It is the caller's responsibility to deal with a NULL
342 return here.
343 */
344 pdf_document *pdf_pin_document(fz_context *ctx, pdf_obj *obj);
345
346 void pdf_set_int(fz_context *ctx, pdf_obj *obj, int64_t i);
347
348 /* Voodoo to create PDF_NAME(Foo) macros from name-table.h */
349
350 #define PDF_NAME(X) ((pdf_obj*)(intptr_t)PDF_ENUM_NAME_##X)
351
352 #define PDF_MAKE_NAME(STRING,NAME) PDF_ENUM_NAME_##NAME,
353 enum {
354 PDF_ENUM_NULL,
355 PDF_ENUM_TRUE,
356 PDF_ENUM_FALSE,
357 #include "mupdf/pdf/name-table.h"
358 PDF_ENUM_LIMIT,
359 };
360 #undef PDF_MAKE_NAME
361
362 #define PDF_NULL ((pdf_obj*)(intptr_t)PDF_ENUM_NULL)
363 #define PDF_TRUE ((pdf_obj*)(intptr_t)PDF_ENUM_TRUE)
364 #define PDF_FALSE ((pdf_obj*)(intptr_t)PDF_ENUM_FALSE)
365 #define PDF_LIMIT ((pdf_obj*)(intptr_t)PDF_ENUM_LIMIT)
366
367
368 /* Implementation details: subject to change. */
369
370 /*
371 for use by pdf_crypt_obj_imp to decrypt AES string in place
372 */
373 void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, size_t newlen);
374
375
376 /* Journalling */
377
378 /* Call this to enable journalling on a given document. */
379 void pdf_enable_journal(fz_context *ctx, pdf_document *doc);
380
381 /* Call this to start an operation. Undo/redo works at 'operation'
382 * granularity. Nested operations are all counted within the outermost
383 * operation. Any modification performed on a journalled PDF without an
384 * operation having been started will throw an error. */
385 void pdf_begin_operation(fz_context *ctx, pdf_document *doc, const char *operation);
386
387 /* Call this to start an implicit operation. Implicit operations are
388 * operations that happen as a consequence of things like updating
389 * an annotation. They get rolled into the previous operation, because
390 * they generally happen as a result of them. */
391 void pdf_begin_implicit_operation(fz_context *ctx, pdf_document *doc);
392
393 /* Call this to end an operation. */
394 void pdf_end_operation(fz_context *ctx, pdf_document *doc);
395
396 /* Call this to abandon an operation. Revert to the state
397 * when you began. */
398 void pdf_abandon_operation(fz_context *ctx, pdf_document *doc);
399
400 /* Call this to find out how many undo/redo steps there are, and the
401 * current position we are within those. 0 = original document,
402 * *steps = final edited version. */
403 int pdf_undoredo_state(fz_context *ctx, pdf_document *doc, int *steps);
404
405 /* Call this to find the title of the operation within the undo state. */
406 const char *pdf_undoredo_step(fz_context *ctx, pdf_document *doc, int step);
407
408 /* Helper functions to identify if we are in a state to be able to undo
409 * or redo. */
410 int pdf_can_undo(fz_context *ctx, pdf_document *doc);
411 int pdf_can_redo(fz_context *ctx, pdf_document *doc);
412
413 /* Move backwards in the undo history. Throws an error if we are at the
414 * start. Any edits to the document at this point will discard all
415 * subsequent history. */
416 void pdf_undo(fz_context *ctx, pdf_document *doc);
417
418 /* Move forwards in the undo history. Throws an error if we are at the
419 * end. */
420 void pdf_redo(fz_context *ctx, pdf_document *doc);
421
422 /* Called to reset the entire history. This is called implicitly when
423 * a non-undoable change occurs (such as a pdf repair). */
424 void pdf_discard_journal(fz_context *ctx, pdf_journal *journal);
425
426 /* Internal destructor. */
427 void pdf_drop_journal(fz_context *ctx, pdf_journal *journal);
428
429 /* Internal call as part of saving a snapshot of a PDF document. */
430 void pdf_serialise_journal(fz_context *ctx, pdf_document *doc, fz_output *out);
431
432 /* Internal call as part of loading a snapshot of a PDF document. */
433 void pdf_deserialise_journal(fz_context *ctx, pdf_document *doc, fz_stream *stm);
434
435 /* Internal call as part of creating objects. */
436 void pdf_add_journal_fragment(fz_context *ctx, pdf_document *doc, int parent, pdf_obj *copy, fz_buffer *copy_stream, int newobj);
437
438 char *pdf_format_date(fz_context *ctx, int64_t time, char *s, size_t n);
439 int64_t pdf_parse_date(fz_context *ctx, const char *s);
440
441 int pdf_is_image_stream(fz_context *ctx, pdf_obj *obj);
442
443 #endif