| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445 |
- // Copyright (C) 2004-2025 Artifex Software, Inc.
- //
- // This file is part of MuPDF.
- //
- // MuPDF is free software: you can redistribute it and/or modify it under the
- // terms of the GNU Affero General Public License as published by the Free
- // Software Foundation, either version 3 of the License, or (at your option)
- // any later version.
- //
- // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
- // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
- // details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
- //
- // Alternative licensing terms are available from the licensor.
- // For commercial licensing, see <https://www.artifex.com/> or contact
- // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
- // CA 94129, USA, for further information.
- #ifndef MUPDF_PDF_OBJECT_H
- #define MUPDF_PDF_OBJECT_H
- #include "mupdf/fitz/stream.h"
- typedef struct pdf_document pdf_document;
- typedef struct pdf_crypt pdf_crypt;
- typedef struct pdf_journal pdf_journal;
- typedef struct pdf_resource_stack pdf_resource_stack;
- /* Defined in PDF 1.7 according to Acrobat limit. */
- #define PDF_MAX_OBJECT_NUMBER 8388607
- #define PDF_MAX_GEN_NUMBER 65535
- /*
- * Dynamic objects.
- * The same type of objects as found in PDF and PostScript.
- * Used by the filters and the mupdf parser.
- */
- typedef struct pdf_obj pdf_obj;
- pdf_obj *pdf_new_int(fz_context *ctx, int64_t i);
- pdf_obj *pdf_new_real(fz_context *ctx, float f);
- pdf_obj *pdf_new_name(fz_context *ctx, const char *str);
- pdf_obj *pdf_new_string(fz_context *ctx, const char *str, size_t len);
- /*
- Create a PDF 'text string' by encoding input string as either ASCII or UTF-16BE.
- In theory, we could also use PDFDocEncoding.
- */
- pdf_obj *pdf_new_text_string(fz_context *ctx, const char *s);
- pdf_obj *pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen);
- pdf_obj *pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap);
- pdf_obj *pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap);
- pdf_obj *pdf_new_point(fz_context *ctx, pdf_document *doc, fz_point point);
- pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, fz_rect rect);
- pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, fz_matrix mtx);
- pdf_obj *pdf_new_date(fz_context *ctx, pdf_document *doc, int64_t time);
- pdf_obj *pdf_copy_array(fz_context *ctx, pdf_obj *array);
- pdf_obj *pdf_copy_dict(fz_context *ctx, pdf_obj *dict);
- pdf_obj *pdf_deep_copy_obj(fz_context *ctx, pdf_obj *obj);
- pdf_obj *pdf_keep_obj(fz_context *ctx, pdf_obj *obj);
- void pdf_drop_obj(fz_context *ctx, pdf_obj *obj);
- pdf_obj *pdf_drop_singleton_obj(fz_context *ctx, pdf_obj *obj);
- int pdf_is_null(fz_context *ctx, pdf_obj *obj);
- int pdf_is_bool(fz_context *ctx, pdf_obj *obj);
- int pdf_is_int(fz_context *ctx, pdf_obj *obj);
- int pdf_is_real(fz_context *ctx, pdf_obj *obj);
- int pdf_is_number(fz_context *ctx, pdf_obj *obj);
- int pdf_is_name(fz_context *ctx, pdf_obj *obj);
- int pdf_is_string(fz_context *ctx, pdf_obj *obj);
- int pdf_is_array(fz_context *ctx, pdf_obj *obj);
- int pdf_is_dict(fz_context *ctx, pdf_obj *obj);
- int pdf_is_indirect(fz_context *ctx, pdf_obj *obj);
- /*
- Check if an object is a stream or not.
- */
- int pdf_obj_num_is_stream(fz_context *ctx, pdf_document *doc, int num);
- int pdf_is_stream(fz_context *ctx, pdf_obj *obj);
- /* Compare 2 objects. Returns 0 on match, non-zero on mismatch.
- * Streams always mismatch.
- */
- int pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b);
- int pdf_objcmp_resolve(fz_context *ctx, pdf_obj *a, pdf_obj *b);
- /* Compare 2 objects. Returns 0 on match, non-zero on mismatch.
- * Stream contents are explicitly checked.
- */
- int pdf_objcmp_deep(fz_context *ctx, pdf_obj *a, pdf_obj *b);
- int pdf_name_eq(fz_context *ctx, pdf_obj *a, pdf_obj *b);
- int pdf_obj_marked(fz_context *ctx, pdf_obj *obj);
- int pdf_mark_obj(fz_context *ctx, pdf_obj *obj);
- void pdf_unmark_obj(fz_context *ctx, pdf_obj *obj);
- typedef struct pdf_cycle_list pdf_cycle_list;
- struct pdf_cycle_list {
- pdf_cycle_list *up;
- int num;
- };
- int pdf_cycle(fz_context *ctx, pdf_cycle_list *here, pdf_cycle_list *prev, pdf_obj *obj);
- typedef struct
- {
- int len;
- unsigned char bits[FZ_FLEXIBLE_ARRAY];
- } pdf_mark_bits;
- pdf_mark_bits *pdf_new_mark_bits(fz_context *ctx, pdf_document *doc);
- void pdf_drop_mark_bits(fz_context *ctx, pdf_mark_bits *marks);
- void pdf_mark_bits_reset(fz_context *ctx, pdf_mark_bits *marks);
- int pdf_mark_bits_set(fz_context *ctx, pdf_mark_bits *marks, pdf_obj *obj);
- typedef struct
- {
- int len;
- int max;
- int *list;
- int local_list[8];
- } pdf_mark_list;
- int pdf_mark_list_push(fz_context *ctx, pdf_mark_list *list, pdf_obj *obj);
- void pdf_mark_list_pop(fz_context *ctx, pdf_mark_list *list);
- int pdf_mark_list_check(fz_context *ctx, pdf_mark_list *list, pdf_obj *obj);
- void pdf_mark_list_init(fz_context *ctx, pdf_mark_list *list);
- void pdf_mark_list_free(fz_context *ctx, pdf_mark_list *list);
- void pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo);
- int pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo);
- int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj);
- void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj);
- void pdf_clean_obj(fz_context *ctx, pdf_obj *obj);
- int pdf_to_bool(fz_context *ctx, pdf_obj *obj);
- int pdf_to_int(fz_context *ctx, pdf_obj *obj);
- int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj);
- float pdf_to_real(fz_context *ctx, pdf_obj *obj);
- const char *pdf_to_name(fz_context *ctx, pdf_obj *obj);
- const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj);
- const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep);
- char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj);
- size_t pdf_to_str_len(fz_context *ctx, pdf_obj *obj);
- int pdf_to_num(fz_context *ctx, pdf_obj *obj);
- int pdf_to_gen(fz_context *ctx, pdf_obj *obj);
- int pdf_to_bool_default(fz_context *ctx, pdf_obj *obj, int def);
- int pdf_to_int_default(fz_context *ctx, pdf_obj *obj, int def);
- float pdf_to_real_default(fz_context *ctx, pdf_obj *obj, float def);
- int pdf_array_len(fz_context *ctx, pdf_obj *array);
- pdf_obj *pdf_array_get(fz_context *ctx, pdf_obj *array, int i);
- void pdf_array_put(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
- void pdf_array_put_drop(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
- void pdf_array_push(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
- void pdf_array_push_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
- void pdf_array_insert(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
- void pdf_array_insert_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
- void pdf_array_delete(fz_context *ctx, pdf_obj *array, int index);
- int pdf_array_find(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
- int pdf_array_contains(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
- int pdf_dict_len(fz_context *ctx, pdf_obj *dict);
- pdf_obj *pdf_dict_get_key(fz_context *ctx, pdf_obj *dict, int idx);
- pdf_obj *pdf_dict_get_val(fz_context *ctx, pdf_obj *dict, int idx);
- void pdf_dict_put_val_null(fz_context *ctx, pdf_obj *obj, int idx);
- pdf_obj *pdf_dict_get(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- pdf_obj *pdf_dict_getp(fz_context *ctx, pdf_obj *dict, const char *path);
- pdf_obj *pdf_dict_getl(fz_context *ctx, pdf_obj *dict, ...);
- pdf_obj *pdf_dict_geta(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *abbrev);
- pdf_obj *pdf_dict_gets(fz_context *ctx, pdf_obj *dict, const char *key);
- pdf_obj *pdf_dict_getsa(fz_context *ctx, pdf_obj *dict, const char *key, const char *abbrev);
- pdf_obj *pdf_dict_get_inheritable(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- pdf_obj *pdf_dict_getp_inheritable(fz_context *ctx, pdf_obj *dict, const char *path);
- pdf_obj *pdf_dict_gets_inheritable(fz_context *ctx, pdf_obj *dict, const char *key);
- void pdf_dict_put(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
- void pdf_dict_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
- void pdf_dict_get_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val, pdf_obj **old_val);
- void pdf_dict_puts(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
- void pdf_dict_puts_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
- void pdf_dict_putp(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
- void pdf_dict_putp_drop(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
- void pdf_dict_putl(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
- void pdf_dict_putl_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
- void pdf_dict_del(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- void pdf_dict_dels(fz_context *ctx, pdf_obj *dict, const char *key);
- void pdf_sort_dict(fz_context *ctx, pdf_obj *dict);
- void pdf_dict_put_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int x);
- void pdf_dict_put_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t x);
- void pdf_dict_put_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key, double x);
- void pdf_dict_put_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
- void pdf_dict_put_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x, size_t n);
- void pdf_dict_put_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
- void pdf_dict_put_indirect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int num);
- void pdf_dict_put_point(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_point x);
- void pdf_dict_put_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_rect x);
- void pdf_dict_put_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_matrix x);
- void pdf_dict_put_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t time);
- pdf_obj *pdf_dict_put_array(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
- pdf_obj *pdf_dict_put_dict(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
- pdf_obj *pdf_dict_puts_dict(fz_context *ctx, pdf_obj *dict, const char *key, int initial);
- int pdf_dict_get_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int pdf_dict_get_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int64_t pdf_dict_get_int64(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- float pdf_dict_get_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
- const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- const char *pdf_dict_get_text_string_opt(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- fz_point pdf_dict_get_point(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- fz_rect pdf_dict_get_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- fz_matrix pdf_dict_get_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int64_t pdf_dict_get_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int pdf_dict_get_bool_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int def);
- int pdf_dict_get_int_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int def);
- float pdf_dict_get_real_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, float def);
- int pdf_dict_get_inheritable_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int pdf_dict_get_inheritable_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int64_t pdf_dict_get_inheritable_int64(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- float pdf_dict_get_inheritable_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- const char *pdf_dict_get_inheritable_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- const char *pdf_dict_get_inheritable_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
- const char *pdf_dict_get_inheritable_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- fz_rect pdf_dict_get_inheritable_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- fz_matrix pdf_dict_get_inheritable_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- int64_t pdf_dict_get_inheritable_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
- void pdf_array_push_bool(fz_context *ctx, pdf_obj *array, int x);
- void pdf_array_push_int(fz_context *ctx, pdf_obj *array, int64_t x);
- void pdf_array_push_real(fz_context *ctx, pdf_obj *array, double x);
- void pdf_array_push_name(fz_context *ctx, pdf_obj *array, const char *x);
- void pdf_array_push_string(fz_context *ctx, pdf_obj *array, const char *x, size_t n);
- void pdf_array_push_text_string(fz_context *ctx, pdf_obj *array, const char *x);
- pdf_obj *pdf_array_push_array(fz_context *ctx, pdf_obj *array, int initial);
- pdf_obj *pdf_array_push_dict(fz_context *ctx, pdf_obj *array, int initial);
- void pdf_array_put_bool(fz_context *ctx, pdf_obj *array, int i, int x);
- void pdf_array_put_int(fz_context *ctx, pdf_obj *array, int i, int64_t x);
- void pdf_array_put_real(fz_context *ctx, pdf_obj *array, int i, double x);
- void pdf_array_put_name(fz_context *ctx, pdf_obj *array, int i, const char *x);
- void pdf_array_put_string(fz_context *ctx, pdf_obj *array, int i, const char *x, size_t n);
- void pdf_array_put_text_string(fz_context *ctx, pdf_obj *array, int i, const char *x);
- pdf_obj *pdf_array_put_array(fz_context *ctx, pdf_obj *array, int i, int initial);
- pdf_obj *pdf_array_put_dict(fz_context *ctx, pdf_obj *array, int i, int initial);
- int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index);
- int pdf_array_get_int(fz_context *ctx, pdf_obj *array, int index);
- float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index);
- const char *pdf_array_get_name(fz_context *ctx, pdf_obj *array, int index);
- const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep);
- const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index);
- fz_rect pdf_array_get_rect(fz_context *ctx, pdf_obj *array, int index);
- fz_matrix pdf_array_get_matrix(fz_context *ctx, pdf_obj *array, int index);
- void pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num);
- int pdf_obj_refs(fz_context *ctx, pdf_obj *ref);
- int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj);
- char *pdf_sprint_obj(fz_context *ctx, char *buf, size_t cap, size_t *len, pdf_obj *obj, int tight, int ascii);
- void pdf_print_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight, int ascii);
- 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);
- void pdf_debug_obj(fz_context *ctx, pdf_obj *obj);
- void pdf_debug_ref(fz_context *ctx, pdf_obj *obj);
- /*
- Convert Unicode/PdfDocEncoding string into utf-8.
- The returned string must be freed by the caller.
- */
- char *pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *srcptr, size_t srclen);
- /*
- Convert text string object to UTF-8.
- The returned string must be freed by the caller.
- */
- char *pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src);
- /*
- Load text stream and convert to UTF-8.
- The returned string must be freed by the caller.
- */
- char *pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src);
- /*
- Load text stream or text string and convert to UTF-8.
- The returned string must be freed by the caller.
- */
- char *pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src);
- fz_quad pdf_to_quad(fz_context *ctx, pdf_obj *array, int offset);
- fz_point pdf_to_point(fz_context *ctx, pdf_obj *array, int offset);
- fz_rect pdf_to_rect(fz_context *ctx, pdf_obj *array);
- fz_matrix pdf_to_matrix(fz_context *ctx, pdf_obj *array);
- int64_t pdf_to_date(fz_context *ctx, pdf_obj *time);
- /*
- pdf_get_indirect_document and pdf_get_bound_document are
- now deprecated. Please do not use them in future. They will
- be removed.
- Please use pdf_pin_document instead.
- */
- pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj);
- pdf_document *pdf_get_bound_document(fz_context *ctx, pdf_obj *obj);
- /*
- pdf_pin_document returns a new reference to the document
- to which obj is bound. The caller is responsible for
- dropping this reference once they have finished with it.
- This is a replacement for pdf_get_indirect_document
- and pdf_get_bound_document that are now deprecated. Those
- returned a borrowed reference that did not need to be
- dropped.
- Note that this can validly return NULL in various cases:
- 1) When the object is of a simple type (such as a number
- or a string), it contains no reference to the enclosing
- document. 2) When the object has yet to be inserted into
- a PDF document (such as during parsing). 3) And (in
- future versions) when the document has been destroyed
- but the object reference remains.
- It is the caller's responsibility to deal with a NULL
- return here.
- */
- pdf_document *pdf_pin_document(fz_context *ctx, pdf_obj *obj);
- void pdf_set_int(fz_context *ctx, pdf_obj *obj, int64_t i);
- /* Voodoo to create PDF_NAME(Foo) macros from name-table.h */
- #define PDF_NAME(X) ((pdf_obj*)(intptr_t)PDF_ENUM_NAME_##X)
- #define PDF_MAKE_NAME(STRING,NAME) PDF_ENUM_NAME_##NAME,
- enum {
- PDF_ENUM_NULL,
- PDF_ENUM_TRUE,
- PDF_ENUM_FALSE,
- #include "mupdf/pdf/name-table.h"
- PDF_ENUM_LIMIT,
- };
- #undef PDF_MAKE_NAME
- #define PDF_NULL ((pdf_obj*)(intptr_t)PDF_ENUM_NULL)
- #define PDF_TRUE ((pdf_obj*)(intptr_t)PDF_ENUM_TRUE)
- #define PDF_FALSE ((pdf_obj*)(intptr_t)PDF_ENUM_FALSE)
- #define PDF_LIMIT ((pdf_obj*)(intptr_t)PDF_ENUM_LIMIT)
- /* Implementation details: subject to change. */
- /*
- for use by pdf_crypt_obj_imp to decrypt AES string in place
- */
- void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, size_t newlen);
- /* Journalling */
- /* Call this to enable journalling on a given document. */
- void pdf_enable_journal(fz_context *ctx, pdf_document *doc);
- /* Call this to start an operation. Undo/redo works at 'operation'
- * granularity. Nested operations are all counted within the outermost
- * operation. Any modification performed on a journalled PDF without an
- * operation having been started will throw an error. */
- void pdf_begin_operation(fz_context *ctx, pdf_document *doc, const char *operation);
- /* Call this to start an implicit operation. Implicit operations are
- * operations that happen as a consequence of things like updating
- * an annotation. They get rolled into the previous operation, because
- * they generally happen as a result of them. */
- void pdf_begin_implicit_operation(fz_context *ctx, pdf_document *doc);
- /* Call this to end an operation. */
- void pdf_end_operation(fz_context *ctx, pdf_document *doc);
- /* Call this to abandon an operation. Revert to the state
- * when you began. */
- void pdf_abandon_operation(fz_context *ctx, pdf_document *doc);
- /* Call this to find out how many undo/redo steps there are, and the
- * current position we are within those. 0 = original document,
- * *steps = final edited version. */
- int pdf_undoredo_state(fz_context *ctx, pdf_document *doc, int *steps);
- /* Call this to find the title of the operation within the undo state. */
- const char *pdf_undoredo_step(fz_context *ctx, pdf_document *doc, int step);
- /* Helper functions to identify if we are in a state to be able to undo
- * or redo. */
- int pdf_can_undo(fz_context *ctx, pdf_document *doc);
- int pdf_can_redo(fz_context *ctx, pdf_document *doc);
- /* Move backwards in the undo history. Throws an error if we are at the
- * start. Any edits to the document at this point will discard all
- * subsequent history. */
- void pdf_undo(fz_context *ctx, pdf_document *doc);
- /* Move forwards in the undo history. Throws an error if we are at the
- * end. */
- void pdf_redo(fz_context *ctx, pdf_document *doc);
- /* Called to reset the entire history. This is called implicitly when
- * a non-undoable change occurs (such as a pdf repair). */
- void pdf_discard_journal(fz_context *ctx, pdf_journal *journal);
- /* Internal destructor. */
- void pdf_drop_journal(fz_context *ctx, pdf_journal *journal);
- /* Internal call as part of saving a snapshot of a PDF document. */
- void pdf_serialise_journal(fz_context *ctx, pdf_document *doc, fz_output *out);
- /* Internal call as part of loading a snapshot of a PDF document. */
- void pdf_deserialise_journal(fz_context *ctx, pdf_document *doc, fz_stream *stm);
- /* Internal call as part of creating objects. */
- void pdf_add_journal_fragment(fz_context *ctx, pdf_document *doc, int parent, pdf_obj *copy, fz_buffer *copy_stream, int newobj);
- char *pdf_format_date(fz_context *ctx, int64_t time, char *s, size_t n);
- int64_t pdf_parse_date(fz_context *ctx, const char *s);
- int pdf_is_image_stream(fz_context *ctx, pdf_obj *obj);
- #endif
|