xref.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #ifndef MUPDF_PDF_XREF_H
  2. #define MUPDF_PDF_XREF_H
  3. /*
  4. pdf_create_object: Allocate a slot in the xref table and return a fresh unused object number.
  5. */
  6. int pdf_create_object(fz_context *ctx, pdf_document *doc);
  7. /*
  8. pdf_delete_object: Remove object from xref table, marking the slot as free.
  9. */
  10. void pdf_delete_object(fz_context *ctx, pdf_document *doc, int num);
  11. /*
  12. pdf_update_object: Replace object in xref table with the passed in object.
  13. */
  14. void pdf_update_object(fz_context *ctx, pdf_document *doc, int num, pdf_obj *obj);
  15. /*
  16. pdf_update_stream: Replace stream contents for object in xref table with the passed in buffer.
  17. The buffer contents must match the /Filter setting if 'compressed' is true.
  18. If 'compressed' is false, the /Filter and /DecodeParms entries are deleted.
  19. The /Length entry is updated.
  20. */
  21. void pdf_update_stream(fz_context *ctx, pdf_document *doc, pdf_obj *ref, fz_buffer *buf, int compressed);
  22. pdf_obj *pdf_add_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
  23. pdf_obj *pdf_add_object_drop(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
  24. pdf_obj *pdf_add_stream(fz_context *ctx, pdf_document *doc, fz_buffer *buf, pdf_obj *obj, int compressed);
  25. /*
  26. * xref and object / stream api
  27. */
  28. typedef struct pdf_xref_entry_s pdf_xref_entry;
  29. struct pdf_xref_entry_s
  30. {
  31. char type; /* 0=unset (f)ree i(n)use (o)bjstm */
  32. unsigned char flags; /* bit 0 = marked */
  33. unsigned short gen; /* generation / objstm index */
  34. int num; /* original object number (for decryption after renumbering) */
  35. fz_off_t ofs; /* file offset / objstm object number */
  36. fz_off_t stm_ofs; /* on-disk stream */
  37. fz_buffer *stm_buf; /* in-memory stream (for updated objects) */
  38. pdf_obj *obj; /* stored/cached object */
  39. };
  40. enum
  41. {
  42. PDF_OBJ_FLAG_MARK = 1,
  43. };
  44. typedef struct pdf_xref_subsec_s pdf_xref_subsec;
  45. struct pdf_xref_subsec_s
  46. {
  47. pdf_xref_subsec *next;
  48. int len;
  49. fz_off_t start;
  50. pdf_xref_entry *table;
  51. };
  52. struct pdf_xref_s
  53. {
  54. int num_objects;
  55. pdf_xref_subsec *subsec;
  56. pdf_obj *trailer;
  57. pdf_obj *pre_repair_trailer;
  58. pdf_unsaved_sig *unsaved_sigs;
  59. pdf_unsaved_sig **unsaved_sigs_end;
  60. fz_off_t end_ofs; /* file offset to end of xref */
  61. };
  62. pdf_xref_entry *pdf_cache_object(fz_context *ctx, pdf_document *doc, int num);
  63. int pdf_count_objects(fz_context *ctx, pdf_document *doc);
  64. pdf_obj *pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref);
  65. pdf_obj *pdf_resolve_indirect_chain(fz_context *ctx, pdf_obj *ref);
  66. pdf_obj *pdf_load_object(fz_context *ctx, pdf_document *doc, int num);
  67. fz_buffer *pdf_load_raw_stream_number(fz_context *ctx, pdf_document *doc, int num);
  68. fz_buffer *pdf_load_raw_stream(fz_context *ctx, pdf_obj *ref);
  69. fz_buffer *pdf_load_stream_number(fz_context *ctx, pdf_document *doc, int num);
  70. fz_buffer *pdf_load_stream(fz_context *ctx, pdf_obj *ref);
  71. fz_stream *pdf_open_raw_stream_number(fz_context *ctx, pdf_document *doc, int num);
  72. fz_stream *pdf_open_raw_stream(fz_context *ctx, pdf_obj *ref);
  73. fz_stream *pdf_open_stream_number(fz_context *ctx, pdf_document *doc, int num);
  74. fz_stream *pdf_open_stream(fz_context *ctx, pdf_obj *ref);
  75. fz_stream *pdf_open_inline_stream(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *params);
  76. fz_compressed_buffer *pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num);
  77. void pdf_load_compressed_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int length, fz_stream *cstm, int indexed, fz_compressed_image *image);
  78. fz_stream *pdf_open_stream_with_offset(fz_context *ctx, pdf_document *doc, int num, pdf_obj *dict, fz_off_t stm_ofs);
  79. fz_stream *pdf_open_compressed_stream(fz_context *ctx, fz_compressed_buffer *);
  80. fz_stream *pdf_open_contents_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
  81. fz_buffer *pdf_load_stream_truncated(fz_context *ctx, pdf_document *doc, int num, int *truncated);
  82. pdf_obj *pdf_trailer(fz_context *ctx, pdf_document *doc);
  83. void pdf_set_populating_xref_trailer(fz_context *ctx, pdf_document *doc, pdf_obj *trailer);
  84. int pdf_xref_len(fz_context *ctx, pdf_document *doc);
  85. pdf_xref_entry *pdf_get_populating_xref_entry(fz_context *ctx, pdf_document *doc, int i);
  86. pdf_xref_entry *pdf_get_xref_entry(fz_context *ctx, pdf_document *doc, int i);
  87. void pdf_replace_xref(fz_context *ctx, pdf_document *doc, pdf_xref_entry *entries, int n);
  88. void pdf_xref_ensure_incremental_object(fz_context *ctx, pdf_document *doc, int num);
  89. int pdf_xref_is_incremental(fz_context *ctx, pdf_document *doc, int num);
  90. void pdf_xref_store_unsaved_signature(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_signer *signer);
  91. int pdf_xref_obj_is_unsaved_signature(pdf_document *doc, pdf_obj *obj);
  92. void pdf_repair_xref(fz_context *ctx, pdf_document *doc);
  93. void pdf_repair_obj_stms(fz_context *ctx, pdf_document *doc);
  94. void pdf_ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num);
  95. void pdf_mark_xref(fz_context *ctx, pdf_document *doc);
  96. void pdf_clear_xref(fz_context *ctx, pdf_document *doc);
  97. void pdf_clear_xref_to_mark(fz_context *ctx, pdf_document *doc);
  98. int pdf_repair_obj(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf, fz_off_t *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, fz_off_t *tmpofs, pdf_obj **root);
  99. pdf_obj *pdf_progressive_advance(fz_context *ctx, pdf_document *doc, int pagenum);
  100. void pdf_print_xref(fz_context *ctx, pdf_document *);
  101. #endif