| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103 |
- // 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_FITZ_DOCUMENT_H
- #define MUPDF_FITZ_DOCUMENT_H
- #include "mupdf/fitz/system.h"
- #include "mupdf/fitz/types.h"
- #include "mupdf/fitz/context.h"
- #include "mupdf/fitz/geometry.h"
- #include "mupdf/fitz/device.h"
- #include "mupdf/fitz/transition.h"
- #include "mupdf/fitz/link.h"
- #include "mupdf/fitz/outline.h"
- #include "mupdf/fitz/separation.h"
- #include "mupdf/fitz/archive.h"
- typedef struct fz_document_handler fz_document_handler;
- typedef struct fz_page fz_page;
- typedef intptr_t fz_bookmark;
- typedef enum
- {
- FZ_MEDIA_BOX,
- FZ_CROP_BOX,
- FZ_BLEED_BOX,
- FZ_TRIM_BOX,
- FZ_ART_BOX,
- FZ_UNKNOWN_BOX
- } fz_box_type;
- fz_box_type fz_box_type_from_string(const char *name);
- const char *fz_string_from_box_type(fz_box_type box);
- /**
- Simple constructor for fz_locations.
- */
- static inline fz_location fz_make_location(int chapter, int page)
- {
- fz_location loc = { chapter, page };
- return loc;
- }
- enum
- {
- /* 6in at 4:3 */
- FZ_LAYOUT_KINDLE_W = 260,
- FZ_LAYOUT_KINDLE_H = 346,
- FZ_LAYOUT_KINDLE_EM = 9,
- /* 4.25 x 6.87 in */
- FZ_LAYOUT_US_POCKET_W = 306,
- FZ_LAYOUT_US_POCKET_H = 495,
- FZ_LAYOUT_US_POCKET_EM = 10,
- /* 5.5 x 8.5 in */
- FZ_LAYOUT_US_TRADE_W = 396,
- FZ_LAYOUT_US_TRADE_H = 612,
- FZ_LAYOUT_US_TRADE_EM = 11,
- /* 110 x 178 mm */
- FZ_LAYOUT_UK_A_FORMAT_W = 312,
- FZ_LAYOUT_UK_A_FORMAT_H = 504,
- FZ_LAYOUT_UK_A_FORMAT_EM = 10,
- /* 129 x 198 mm */
- FZ_LAYOUT_UK_B_FORMAT_W = 366,
- FZ_LAYOUT_UK_B_FORMAT_H = 561,
- FZ_LAYOUT_UK_B_FORMAT_EM = 10,
- /* 135 x 216 mm */
- FZ_LAYOUT_UK_C_FORMAT_W = 382,
- FZ_LAYOUT_UK_C_FORMAT_H = 612,
- FZ_LAYOUT_UK_C_FORMAT_EM = 11,
- /* 148 x 210 mm */
- FZ_LAYOUT_A5_W = 420,
- FZ_LAYOUT_A5_H = 595,
- FZ_LAYOUT_A5_EM = 11,
- /* Default to A5 */
- FZ_DEFAULT_LAYOUT_W = FZ_LAYOUT_A5_W,
- FZ_DEFAULT_LAYOUT_H = FZ_LAYOUT_A5_H,
- FZ_DEFAULT_LAYOUT_EM = FZ_LAYOUT_A5_EM,
- };
- typedef enum
- {
- FZ_PERMISSION_PRINT = 'p',
- FZ_PERMISSION_COPY = 'c',
- FZ_PERMISSION_EDIT = 'e',
- FZ_PERMISSION_ANNOTATE = 'n',
- FZ_PERMISSION_FORM = 'f',
- FZ_PERMISSION_ACCESSIBILITY = 'y',
- FZ_PERMISSION_ASSEMBLE = 'a',
- FZ_PERMISSION_PRINT_HQ = 'h',
- }
- fz_permission;
- /**
- Type for a function to be called when
- the reference count for the fz_document drops to 0. The
- implementation should release any resources held by the
- document. The actual document pointer will be freed by the
- caller.
- */
- typedef void (fz_document_drop_fn)(fz_context *ctx, fz_document *doc);
- /**
- Type for a function to be
- called to enquire whether the document needs a password
- or not. See fz_needs_password for more information.
- */
- typedef int (fz_document_needs_password_fn)(fz_context *ctx, fz_document *doc);
- /**
- Type for a function to be
- called to attempt to authenticate a password. See
- fz_authenticate_password for more information.
- */
- typedef int (fz_document_authenticate_password_fn)(fz_context *ctx, fz_document *doc, const char *password);
- /**
- Type for a function to be
- called to see if a document grants a certain permission. See
- fz_document_has_permission for more information.
- */
- typedef int (fz_document_has_permission_fn)(fz_context *ctx, fz_document *doc, fz_permission permission);
- /**
- Type for a function to be called to
- load the outlines for a document. See fz_document_load_outline
- for more information.
- */
- typedef fz_outline *(fz_document_load_outline_fn)(fz_context *ctx, fz_document *doc);
- /**
- Type for a function to be called to obtain an outline iterator
- for a document. See fz_document_outline_iterator for more information.
- */
- typedef fz_outline_iterator *(fz_document_outline_iterator_fn)(fz_context *ctx, fz_document *doc);
- /**
- Type for a function to be called to lay
- out a document. See fz_layout_document for more information.
- */
- typedef void (fz_document_layout_fn)(fz_context *ctx, fz_document *doc, float w, float h, float em);
- /**
- Type for a function to be called to
- resolve an internal link to a location (chapter/page number
- tuple). See fz_resolve_link_dest for more information.
- */
- typedef fz_link_dest (fz_document_resolve_link_dest_fn)(fz_context *ctx, fz_document *doc, const char *uri);
- /**
- Type for a function to be called to
- create an internal link to a destination (chapter/page/x/y/w/h/zoom/type
- tuple). See fz_resolve_link_dest for more information.
- */
- typedef char * (fz_document_format_link_uri_fn)(fz_context *ctx, fz_document *doc, fz_link_dest dest);
- /**
- Type for a function to be called to
- count the number of chapters in a document. See
- fz_count_chapters for more information.
- */
- typedef int (fz_document_count_chapters_fn)(fz_context *ctx, fz_document *doc);
- /**
- Type for a function to be called to
- count the number of pages in a document. See fz_count_pages for
- more information.
- */
- typedef int (fz_document_count_pages_fn)(fz_context *ctx, fz_document *doc, int chapter);
- /**
- Type for a function to load a given
- page from a document. See fz_load_page for more information.
- */
- typedef fz_page *(fz_document_load_page_fn)(fz_context *ctx, fz_document *doc, int chapter, int page);
- /**
- Type for a function to get the page label of a page in the document.
- See fz_page_label for more information.
- */
- typedef void (fz_document_page_label_fn)(fz_context *ctx, fz_document *doc, int chapter, int page, char *buf, size_t size);
- /**
- Type for a function to query
- a document's metadata. See fz_lookup_metadata for more
- information.
- */
- typedef int (fz_document_lookup_metadata_fn)(fz_context *ctx, fz_document *doc, const char *key, char *buf, size_t size);
- /**
- Type for a function to set
- a document's metadata. See fz_set_metadata for more
- information.
- */
- typedef void (fz_document_set_metadata_fn)(fz_context *ctx, fz_document *doc, const char *key, const char *value);
- /**
- Return output intent color space if it exists
- */
- typedef fz_colorspace *(fz_document_output_intent_fn)(fz_context *ctx, fz_document *doc);
- /**
- Write document accelerator data
- */
- typedef void (fz_document_output_accelerator_fn)(fz_context *ctx, fz_document *doc, fz_output *out);
- /**
- Send document structure to device
- */
- typedef void (fz_document_run_structure_fn)(fz_context *ctx, fz_document *doc, fz_device *dev, fz_cookie *cookie);
- /**
- Get a handle to this document as PDF.
- Returns a borrowed handle.
- */
- typedef fz_document *(fz_document_as_pdf_fn)(fz_context *ctx, fz_document *doc);
- /**
- Type for a function to make
- a bookmark. See fz_make_bookmark for more information.
- */
- typedef fz_bookmark (fz_document_make_bookmark_fn)(fz_context *ctx, fz_document *doc, fz_location loc);
- /**
- Type for a function to lookup a bookmark.
- See fz_lookup_bookmark for more information.
- */
- typedef fz_location (fz_document_lookup_bookmark_fn)(fz_context *ctx, fz_document *doc, fz_bookmark mark);
- /**
- Type for a function to release all the
- resources held by a page. Called automatically when the
- reference count for that page reaches zero.
- */
- typedef void (fz_page_drop_page_fn)(fz_context *ctx, fz_page *page);
- /**
- Type for a function to return the
- bounding box of a page. See fz_bound_page for more
- information.
- */
- typedef fz_rect (fz_page_bound_page_fn)(fz_context *ctx, fz_page *page, fz_box_type box);
- /**
- Type for a function to run the
- contents of a page. See fz_run_page_contents for more
- information.
- */
- typedef void (fz_page_run_page_fn)(fz_context *ctx, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
- /**
- Type for a function to load the links
- from a page. See fz_load_links for more information.
- */
- typedef fz_link *(fz_page_load_links_fn)(fz_context *ctx, fz_page *page);
- /**
- Type for a function to
- obtain the details of how this page should be presented when
- in presentation mode. See fz_page_presentation for more
- information.
- */
- typedef fz_transition *(fz_page_page_presentation_fn)(fz_context *ctx, fz_page *page, fz_transition *transition, float *duration);
- /**
- Type for a function to enable/
- disable separations on a page. See fz_control_separation for
- more information.
- */
- typedef void (fz_page_control_separation_fn)(fz_context *ctx, fz_page *page, int separation, int disable);
- /**
- Type for a function to detect
- whether a given separation is enabled or disabled on a page.
- See FZ_SEPARATION_DISABLED for more information.
- */
- typedef int (fz_page_separation_disabled_fn)(fz_context *ctx, fz_page *page, int separation);
- /**
- Type for a function to retrieve
- details of separations on a page. See fz_get_separations
- for more information.
- */
- typedef fz_separations *(fz_page_separations_fn)(fz_context *ctx, fz_page *page);
- /**
- Type for a function to retrieve
- whether or not a given page uses overprint.
- */
- typedef int (fz_page_uses_overprint_fn)(fz_context *ctx, fz_page *page);
- /**
- Type for a function to create a link on a page.
- */
- typedef fz_link *(fz_page_create_link_fn)(fz_context *ctx, fz_page *page, fz_rect bbox, const char *uri);
- /**
- Type for a function to delete a link on a page.
- */
- typedef void (fz_page_delete_link_fn)(fz_context *ctx, fz_page *page, fz_link *link);
- /**
- Function type to open a
- document from a file.
- handler: the document handler in use.
- stream: fz_stream to read document data from. Must be
- seekable for formats that require it.
- accel: fz_stream to read accelerator data from. May be
- NULL. May be ignored.
- dir: 'Directory context' in which the document is loaded;
- associated content from (like images for an html stream
- will be loaded from this). Maybe NULL. May be ignored.
- recognize_state: NULL, or a state pointer passed back from the call
- to recognise_content_fn. Ownership does not pass in. The
- caller remains responsible for freeing state.
- Pointer to opened document. Throws exception in case of error.
- */
- typedef fz_document *(fz_document_open_fn)(fz_context *ctx, const fz_document_handler *handler, fz_stream *stream, fz_stream *accel, fz_archive *dir, void *recognize_state);
- /**
- Recognize a document type from
- a magic string.
- handler: the handler in use.
- magic: string to recognise - typically a filename or mime
- type.
- Returns a number between 0 (not recognized) and 100
- (fully recognized) based on how certain the recognizer
- is that this is of the required type.
- */
- typedef int (fz_document_recognize_fn)(fz_context *ctx, const fz_document_handler *handler, const char *magic);
- typedef void (fz_document_recognize_state_free_fn)(fz_context *ctx, void *state);
- /**
- Recognize a document type from stream contents.
- handler: the handler in use.
- stream: stream contents to recognise (may be NULL if document is
- a directory).
- dir: directory context from which stream is loaded.
- recognize_state: pointer to retrieve opaque state that may be used
- by the open routine, or NULL.
- free_recognize_state: pointer to retrieve a function pointer to
- free the opaque state, or NULL.
- Note: state and free_state should either both be NULL or
- both be non-NULL!
- Returns a number between 0 (not recognized) and 100
- (fully recognized) based on how certain the recognizer
- is that this is of the required type.
- */
- typedef int (fz_document_recognize_content_fn)(fz_context *ctx, const fz_document_handler *handler, fz_stream *stream, fz_archive *dir, void **recognize_state, fz_document_recognize_state_free_fn **free_recognize_state);
- /**
- Finalise a document handler.
- This will be called on shutdown for a document handler to
- release resources. This should cope with being called with NULL.
- opaque: The value previously returned by the init call.
- */
- typedef void (fz_document_handler_fin_fn)(fz_context *ctx, const fz_document_handler *handler);
- /**
- Type for a function to be called when processing an already opened page.
- See fz_process_opened_pages.
- */
- typedef void *(fz_process_opened_page_fn)(fz_context *ctx, fz_page *page, void *state);
- /**
- Register a handler for a document type.
- handler: The handler to register. This must live on for the duration of the
- use of this handler. It will be passed back to the handler for calls so
- the caller can use it to retrieve state.
- */
- void fz_register_document_handler(fz_context *ctx, const fz_document_handler *handler);
- /**
- Register handlers for all the standard document types supported in
- this build.
- */
- void fz_register_document_handlers(fz_context *ctx);
- /**
- Given a magic find a document handler that can handle a
- document of this type.
- magic: Can be a filename extension (including initial period) or
- a mimetype.
- */
- const fz_document_handler *fz_recognize_document(fz_context *ctx, const char *magic);
- /**
- Given a filename find a document handler that can handle a
- document of this type.
- filename: The filename of the document. This will be opened and sampled
- to check data.
- */
- const fz_document_handler *fz_recognize_document_content(fz_context *ctx, const char *filename);
- /**
- Given a magic find a document handler that can handle a
- document of this type.
- stream: the file stream to sample. May be NULL if the document is
- a directory.
- magic: Can be a filename extension (including initial period) or
- a mimetype.
- */
- const fz_document_handler *fz_recognize_document_stream_content(fz_context *ctx, fz_stream *stream, const char *magic);
- /**
- Given a magic find a document handler that can handle a
- document of this type.
- stream: the file stream to sample. May be NULL if the document is
- a directory.
- dir: an fz_archive representing the directory from which the
- stream was opened (or NULL).
- magic: Can be a filename extension (including initial period) or
- a mimetype.
- */
- const fz_document_handler *fz_recognize_document_stream_and_dir_content(fz_context *ctx, fz_stream *stream, fz_archive *dir, const char *magic);
- /**
- Open a document file and read its basic structure so pages and
- objects can be located. MuPDF will try to repair broken
- documents (without actually changing the file contents).
- The returned fz_document is used when calling most other
- document related functions.
- filename: a path to a file as it would be given to open(2).
- */
- fz_document *fz_open_document(fz_context *ctx, const char *filename);
- /**
- Open a document file and read its basic structure so pages and
- objects can be located. MuPDF will try to repair broken
- documents (without actually changing the file contents).
- The returned fz_document is used when calling most other
- document related functions.
- filename: a path to a file as it would be given to open(2).
- */
- fz_document *fz_open_accelerated_document(fz_context *ctx, const char *filename, const char *accel);
- /**
- Open a document using the specified stream object rather than
- opening a file on disk.
- magic: a string used to detect document type; either a file name
- or mime-type.
- stream: a stream representing the contents of the document file.
- NOTE: The caller retains ownership of 'stream' - the document will take its
- own reference if required.
- */
- fz_document *fz_open_document_with_stream(fz_context *ctx, const char *magic, fz_stream *stream);
- /**
- Open a document using the specified stream object rather than
- opening a file on disk.
- magic: a string used to detect document type; either a file name
- or mime-type.
- stream: a stream representing the contents of the document file.
- dir: a 'directory context' for those filetypes that need it.
- NOTE: The caller retains ownership of 'stream' and 'dir' - the document will
- take its own references if required.
- */
- fz_document *fz_open_document_with_stream_and_dir(fz_context *ctx, const char *magic, fz_stream *stream, fz_archive *dir);
- /**
- Open a document using a buffer rather than opening a file on disk.
- */
- fz_document *fz_open_document_with_buffer(fz_context *ctx, const char *magic, fz_buffer *buffer);
- /**
- Open a document using the specified stream object rather than
- opening a file on disk.
- magic: a string used to detect document type; either a file name
- or mime-type.
- stream: a stream of the document contents.
- accel: NULL, or a stream of the 'accelerator' contents for this document.
- NOTE: The caller retains ownership of 'stream' and 'accel' - the document will
- take its own references if required.
- */
- fz_document *fz_open_accelerated_document_with_stream(fz_context *ctx, const char *magic, fz_stream *stream, fz_stream *accel);
- /**
- Open a document using the specified stream object rather than
- opening a file on disk.
- magic: a string used to detect document type; either a file name
- or mime-type.
- stream: a stream of the document contents.
- accel: NULL, or a stream of the 'accelerator' contents for this document.
- dir: NULL, or the 'directory context' for the stream contents.
- NOTE: The caller retains ownership of 'stream', 'accel' and 'dir' - the document will
- take its own references if required.
- */
- fz_document *fz_open_accelerated_document_with_stream_and_dir(fz_context *ctx, const char *magic, fz_stream *stream, fz_stream *accel, fz_archive *dir);
- /**
- Query if the document supports the saving of accelerator data.
- */
- int fz_document_supports_accelerator(fz_context *ctx, fz_document *doc);
- /**
- Save accelerator data for the document to a given file.
- */
- void fz_save_accelerator(fz_context *ctx, fz_document *doc, const char *accel);
- /**
- Output accelerator data for the document to a given output
- stream.
- */
- void fz_output_accelerator(fz_context *ctx, fz_document *doc, fz_output *accel);
- /**
- New documents are typically created by calls like
- foo_new_document(fz_context *ctx, ...). These work by
- deriving a new document type from fz_document, for instance:
- typedef struct { fz_document base; ...extras... } foo_document;
- These are allocated by calling
- fz_new_derived_document(ctx, foo_document)
- */
- void *fz_new_document_of_size(fz_context *ctx, int size);
- #define fz_new_derived_document(C,M) ((M*)Memento_label(fz_new_document_of_size(C, sizeof(M)), #M))
- /**
- Increment the document reference count. The same pointer is
- returned.
- Never throws exceptions.
- */
- fz_document *fz_keep_document(fz_context *ctx, fz_document *doc);
- /**
- Decrement the document reference count. When the reference
- count reaches 0, the document and all it's references are
- freed.
- Never throws exceptions.
- */
- void fz_drop_document(fz_context *ctx, fz_document *doc);
- /**
- Check if a document is encrypted with a
- non-blank password.
- */
- int fz_needs_password(fz_context *ctx, fz_document *doc);
- /**
- Test if the given password can decrypt the document.
- password: The password string to be checked. Some document
- specifications do not specify any particular text encoding, so
- neither do we.
- Returns 0 for failure to authenticate, non-zero for success.
- For PDF documents, further information can be given by examining
- the bits in the return code.
- Bit 0 => No password required
- Bit 1 => User password authenticated
- Bit 2 => Owner password authenticated
- */
- int fz_authenticate_password(fz_context *ctx, fz_document *doc, const char *password);
- /**
- Load the hierarchical document outline.
- Should be freed by fz_drop_outline.
- */
- fz_outline *fz_load_outline(fz_context *ctx, fz_document *doc);
- /**
- Get an iterator for the document outline.
- Should be freed by fz_drop_outline_iterator.
- */
- fz_outline_iterator *fz_new_outline_iterator(fz_context *ctx, fz_document *doc);
- /**
- Is the document reflowable.
- Returns 1 to indicate reflowable documents, otherwise 0.
- */
- int fz_is_document_reflowable(fz_context *ctx, fz_document *doc);
- /**
- Layout reflowable document types.
- w, h: Page size in points.
- em: Default font size in points.
- */
- void fz_layout_document(fz_context *ctx, fz_document *doc, float w, float h, float em);
- /**
- Create a bookmark for the given page, which can be used to find
- the same location after the document has been laid out with
- different parameters.
- */
- fz_bookmark fz_make_bookmark(fz_context *ctx, fz_document *doc, fz_location loc);
- /**
- Find a bookmark and return its page number.
- */
- fz_location fz_lookup_bookmark(fz_context *ctx, fz_document *doc, fz_bookmark mark);
- /**
- Return the number of pages in document
- May return 0 for documents with no pages.
- */
- int fz_count_pages(fz_context *ctx, fz_document *doc);
- /**
- Resolve an internal link to a page number, location, and possible viewing parameters.
- Returns location (-1,-1) if the URI cannot be resolved.
- */
- fz_link_dest fz_resolve_link_dest(fz_context *ctx, fz_document *doc, const char *uri);
- /**
- Format an internal link to a page number, location, and possible viewing parameters,
- suitable for use with fz_create_link.
- Returns a newly allocated string that the caller must free.
- */
- char *fz_format_link_uri(fz_context *ctx, fz_document *doc, fz_link_dest dest);
- /**
- Resolve an internal link to a page number.
- xp, yp: Pointer to store coordinate of destination on the page.
- Returns (-1,-1) if the URI cannot be resolved.
- */
- fz_location fz_resolve_link(fz_context *ctx, fz_document *doc, const char *uri, float *xp, float *yp);
- /**
- Run the document structure through a device.
- doc: Document in question.
- dev: Device obtained from fz_new_*_device.
- cookie: Communication mechanism between caller and library.
- Intended for multi-threaded applications, while
- single-threaded applications set cookie to NULL. The
- caller may abort an ongoing rendering of a page. Cookie also
- communicates progress information back to the caller. The
- fields inside cookie are continually updated while the page is
- rendering.
- */
- void fz_run_document_structure(fz_context *ctx, fz_document *doc, fz_device *dev, fz_cookie *cookie);
- /**
- Function to get the location for the last page in the document.
- Using this can be far more efficient in some cases than calling
- fz_count_pages and using the page number.
- */
- fz_location fz_last_page(fz_context *ctx, fz_document *doc);
- /**
- Function to get the location of the next page (allowing for the
- end of chapters etc). If at the end of the document, returns the
- current location.
- */
- fz_location fz_next_page(fz_context *ctx, fz_document *doc, fz_location loc);
- /**
- Function to get the location of the previous page (allowing for
- the end of chapters etc). If already at the start of the
- document, returns the current page.
- */
- fz_location fz_previous_page(fz_context *ctx, fz_document *doc, fz_location loc);
- /**
- Clamps a location into valid chapter/page range. (First clamps
- the chapter into range, then the page into range).
- */
- fz_location fz_clamp_location(fz_context *ctx, fz_document *doc, fz_location loc);
- /**
- Converts from page number to chapter+page. This may cause many
- chapters to be laid out in order to calculate the number of
- pages within those chapters.
- */
- fz_location fz_location_from_page_number(fz_context *ctx, fz_document *doc, int number);
- /**
- Converts from chapter+page to page number. This may cause many
- chapters to be laid out in order to calculate the number of
- pages within those chapters.
- */
- int fz_page_number_from_location(fz_context *ctx, fz_document *doc, fz_location loc);
- /**
- Load a given page number from a document. This may be much less
- efficient than loading by location (chapter+page) for some
- document types.
- */
- fz_page *fz_load_page(fz_context *ctx, fz_document *doc, int number);
- /**
- Return the number of chapters in the document.
- At least 1.
- */
- int fz_count_chapters(fz_context *ctx, fz_document *doc);
- /**
- Return the number of pages in a chapter.
- May return 0.
- */
- int fz_count_chapter_pages(fz_context *ctx, fz_document *doc, int chapter);
- /**
- Load a page.
- After fz_load_page is it possible to retrieve the size of the
- page using fz_bound_page, or to render the page using
- fz_run_page_*. Free the page by calling fz_drop_page.
- chapter: chapter number, 0 is the first chapter of the document.
- number: page number, 0 is the first page of the chapter.
- */
- fz_page *fz_load_chapter_page(fz_context *ctx, fz_document *doc, int chapter, int page);
- /**
- Load the list of links for a page.
- Returns a linked list of all the links on the page, each with
- its clickable region and link destination. Each link is
- reference counted so drop and free the list of links by
- calling fz_drop_link on the pointer return from fz_load_links.
- page: Page obtained from fz_load_page.
- */
- fz_link *fz_load_links(fz_context *ctx, fz_page *page);
- /**
- Different document types will be implemented by deriving from
- fz_page. This macro allocates such derived structures, and
- initialises the base sections.
- */
- fz_page *fz_new_page_of_size(fz_context *ctx, int size, fz_document *doc);
- #define fz_new_derived_page(CTX,TYPE,DOC) \
- ((TYPE *)Memento_label(fz_new_page_of_size(CTX,sizeof(TYPE),DOC),#TYPE))
- /**
- Determine the size of a page at 72 dpi.
- */
- fz_rect fz_bound_page(fz_context *ctx, fz_page *page);
- fz_rect fz_bound_page_box(fz_context *ctx, fz_page *page, fz_box_type box);
- /**
- Run a page through a device.
- page: Page obtained from fz_load_page.
- dev: Device obtained from fz_new_*_device.
- transform: Transform to apply to page. May include for example
- scaling and rotation, see fz_scale, fz_rotate and fz_concat.
- Set to fz_identity if no transformation is desired.
- cookie: Communication mechanism between caller and library
- rendering the page. Intended for multi-threaded applications,
- while single-threaded applications set cookie to NULL. The
- caller may abort an ongoing rendering of a page. Cookie also
- communicates progress information back to the caller. The
- fields inside cookie are continually updated while the page is
- rendering.
- */
- void fz_run_page(fz_context *ctx, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
- /**
- Run a page through a device. Just the main
- page content, without the annotations, if any.
- page: Page obtained from fz_load_page.
- dev: Device obtained from fz_new_*_device.
- transform: Transform to apply to page. May include for example
- scaling and rotation, see fz_scale, fz_rotate and fz_concat.
- Set to fz_identity if no transformation is desired.
- cookie: Communication mechanism between caller and library
- rendering the page. Intended for multi-threaded applications,
- while single-threaded applications set cookie to NULL. The
- caller may abort an ongoing rendering of a page. Cookie also
- communicates progress information back to the caller. The
- fields inside cookie are continually updated while the page is
- rendering.
- */
- void fz_run_page_contents(fz_context *ctx, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
- /**
- Run the annotations on a page through a device.
- */
- void fz_run_page_annots(fz_context *ctx, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
- /**
- Run the widgets on a page through a device.
- */
- void fz_run_page_widgets(fz_context *ctx, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
- /**
- Increment the reference count for the page. Returns the same
- pointer.
- Never throws exceptions.
- */
- fz_page *fz_keep_page(fz_context *ctx, fz_page *page);
- /**
- Decrements the reference count for the page. When the reference
- count hits 0, the page and its references are freed.
- Never throws exceptions.
- */
- void fz_drop_page(fz_context *ctx, fz_page *page);
- /**
- Get the presentation details for a given page.
- transition: A pointer to a transition struct to fill out.
- duration: A pointer to a place to set the page duration in
- seconds. Will be set to 0 if no transition is specified for the
- page.
- Returns: a pointer to the transition structure, or NULL if there
- is no transition specified for the page.
- */
- fz_transition *fz_page_presentation(fz_context *ctx, fz_page *page, fz_transition *transition, float *duration);
- /**
- Get page label for a given page.
- */
- const char *fz_page_label(fz_context *ctx, fz_page *page, char *buf, int size);
- /**
- Check permission flags on document.
- */
- int fz_has_permission(fz_context *ctx, fz_document *doc, fz_permission p);
- /**
- Retrieve document meta data strings.
- doc: The document to query.
- key: Which meta data key to retrieve...
- Basic information:
- 'format' -- Document format and version.
- 'encryption' -- Description of the encryption used.
- From the document information dictionary:
- 'info:Title'
- 'info:Author'
- 'info:Subject'
- 'info:Keywords'
- 'info:Creator'
- 'info:Producer'
- 'info:CreationDate'
- 'info:ModDate'
- buf: The buffer to hold the results (a nul-terminated UTF-8
- string).
- size: Size of 'buf'.
- Returns the number of bytes need to store the string plus terminator
- (will be larger than 'size' if the output was truncated), or -1 if the
- key is not recognized or found.
- */
- int fz_lookup_metadata(fz_context *ctx, fz_document *doc, const char *key, char *buf, size_t size);
- #define FZ_META_FORMAT "format"
- #define FZ_META_ENCRYPTION "encryption"
- #define FZ_META_INFO "info:"
- #define FZ_META_INFO_TITLE "info:Title"
- #define FZ_META_INFO_AUTHOR "info:Author"
- #define FZ_META_INFO_SUBJECT "info:Subject"
- #define FZ_META_INFO_KEYWORDS "info:Keywords"
- #define FZ_META_INFO_CREATOR "info:Creator"
- #define FZ_META_INFO_PRODUCER "info:Producer"
- #define FZ_META_INFO_CREATIONDATE "info:CreationDate"
- #define FZ_META_INFO_MODIFICATIONDATE "info:ModDate"
- void fz_set_metadata(fz_context *ctx, fz_document *doc, const char *key, const char *value);
- /**
- Find the output intent colorspace if the document has defined
- one.
- Returns a borrowed reference that should not be dropped, unless
- it is kept first.
- */
- fz_colorspace *fz_document_output_intent(fz_context *ctx, fz_document *doc);
- /**
- Get the separations details for a page.
- This will be NULL, unless the format specifically supports
- separations (such as PDF files). May be NULL even
- so, if there are no separations on a page.
- Returns a reference that must be dropped.
- */
- fz_separations *fz_page_separations(fz_context *ctx, fz_page *page);
- /**
- Query if a given page requires overprint.
- */
- int fz_page_uses_overprint(fz_context *ctx, fz_page *page);
- /**
- Create a new link on a page.
- */
- fz_link *fz_create_link(fz_context *ctx, fz_page *page, fz_rect bbox, const char *uri);
- /**
- Delete an existing link on a page.
- */
- void fz_delete_link(fz_context *ctx, fz_page *page, fz_link *link);
- /**
- Iterates over all opened pages of the document, calling the
- provided callback for each page for processing. If the callback
- returns non-NULL then the iteration stops and that value is returned
- to the called of fz_process_opened_pages().
- The state pointer provided to fz_process_opened_pages() is
- passed on to the callback but is owned by the caller.
- Returns the first non-NULL value returned by the callback,
- or NULL if the callback returned NULL for all opened pages.
- */
- void *fz_process_opened_pages(fz_context *ctx, fz_document *doc, fz_process_opened_page_fn *process_openend_page, void *state);
- /* Implementation details: subject to change. */
- /**
- Structure definition is public so other classes can
- derive from it. Do not access the members directly.
- */
- struct fz_page
- {
- int refs;
- fz_document *doc; /* kept reference to parent document. Guaranteed non-NULL. */
- int chapter; /* chapter number */
- int number; /* page number in chapter */
- int incomplete; /* incomplete from progressive loading; don't cache! */
- int in_doc; /* page has been placed into the document */
- fz_page_drop_page_fn *drop_page;
- fz_page_bound_page_fn *bound_page;
- fz_page_run_page_fn *run_page_contents;
- fz_page_run_page_fn *run_page_annots;
- fz_page_run_page_fn *run_page_widgets;
- fz_page_load_links_fn *load_links;
- fz_page_page_presentation_fn *page_presentation;
- fz_page_control_separation_fn *control_separation;
- fz_page_separation_disabled_fn *separation_disabled;
- fz_page_separations_fn *separations;
- fz_page_uses_overprint_fn *overprint;
- fz_page_create_link_fn *create_link;
- fz_page_delete_link_fn *delete_link;
- /* linked list of currently open pages. This list is maintained
- * by fz_load_chapter_page and fz_drop_page. All pages hold a
- * kept reference to the document, so the document cannot disappear
- * while pages exist. 'Incomplete' pages are NOT kept in this
- * list. */
- fz_page **prev, *next;
- };
- /**
- Structure definition is public so other classes can
- derive from it. Callers should not access the members
- directly, though implementations will need initialize
- functions directly.
- */
- struct fz_document
- {
- int refs;
- fz_document_drop_fn *drop_document;
- fz_document_needs_password_fn *needs_password;
- fz_document_authenticate_password_fn *authenticate_password;
- fz_document_has_permission_fn *has_permission;
- fz_document_load_outline_fn *load_outline;
- fz_document_outline_iterator_fn *outline_iterator;
- fz_document_layout_fn *layout;
- fz_document_make_bookmark_fn *make_bookmark;
- fz_document_lookup_bookmark_fn *lookup_bookmark;
- fz_document_resolve_link_dest_fn *resolve_link_dest;
- fz_document_format_link_uri_fn *format_link_uri;
- fz_document_count_chapters_fn *count_chapters;
- fz_document_count_pages_fn *count_pages;
- fz_document_load_page_fn *load_page;
- fz_document_page_label_fn *page_label;
- fz_document_lookup_metadata_fn *lookup_metadata;
- fz_document_set_metadata_fn *set_metadata;
- fz_document_output_intent_fn *get_output_intent;
- fz_document_output_accelerator_fn *output_accelerator;
- fz_document_run_structure_fn *run_structure;
- fz_document_as_pdf_fn *as_pdf;
- int did_layout;
- int is_reflowable;
- int id;
- /* Linked list of currently open pages. These are not
- * references, but just a linked list of open pages,
- * maintained by fz_load_chapter_page, and fz_drop_page.
- * Every page holds a kept reference to the document, so
- * the document cannot be destroyed while a page exists.
- * Incomplete pages are NOT inserted into this list, but
- * do still hold a real document reference. */
- fz_page *open;
- };
- struct fz_document_handler
- {
- /* These fields are initialised by the handler when it is registered. */
- fz_document_recognize_fn *recognize;
- fz_document_open_fn *open;
- const char **extensions;
- const char **mimetypes;
- fz_document_recognize_content_fn *recognize_content;
- int wants_dir;
- int wants_file;
- fz_document_handler_fin_fn *fin;
- };
- #endif
|